Python:将二进制文件读入结构,然后解压缩

拉希特·阿格劳瓦尔(Rachit Agrawal)

我正在将C ++代码转换为python。C ++代码读取一个二进制文件,然后将其转换为不同的字节序。我面临在python中执行相同操作的问题。有人可以帮我吗?

这是C ++代码:

  if( bByteSwap ) // make big-endian
  {
     pHdr = (UDUMPHDR *)buf;
     iAPID = pHdr->sHdr.ccsdsHdr.sW1.uAPID;
     iType = pHdr->sHdr.ccsdsHdr.sW7.uFmtID;
     iSeqCnt = pHdr->sHdr.ccsdsHdr.uiPktSeq;


     for( BYTE *pB=buf; pB<buf+nSz; pB+=2 ) ByteSwap( pB, 2 );
}
else    // already big-endian
{
    ::CopyMemory( buf1, buf, nSz1 ); 

    for( BYTE *pB=buf1; pB<buf1+nSz1; pB+=2 ) ByteSwap( pB, 2 );

    pHdr1 = (UDUMPHDR *)buf1;

    iAPID = pHdr1->sHdr.ccsdsHdr.sW1.uAPID;
    iType = pHdr1->sHdr.ccsdsHdr.sW7.uFmtID;
    iSeqCnt = pHdr1->sHdr.ccsdsHdr.uiPktSeq;
}

在这里,UDUMPHDR是一个结构。我在python中使用ctypes创建相同的结构,并使用fileHandle.readinto(s)函数从二进制文件中读取结构。有人可以帮助我实现此目的的最佳方法是什么?

当前编写的Python代码:

class UDUMPHDR(Union):
_fields_ = [("sHdr", TLEDUMPHDR),
            ("wHdr", WORD * int(sys.getsizeof(TLEDUMPHDR)/2)),
            ("bHdr", BYTE * sys.getsizeof(TLEDUMPHDR))]


hFile = open(myFile, 'rb')
s = UDUMPHDR()

print("Bytes read:", hFile.readinto(s))

#Make it Big Endian
if(bByteSwap):
    print("PktCnt:" + str(s.sHdr.pktHdr.uiPktCnt))
    iAPID = s.sHdr.ccsdsHdr.sW1.uAPID
    iType = s.sHdr.ccsdsHdr.sW7.uFmtID
    iSeqCnt = s.sHdr.ccsdsHdr.uiPktSeq

else:

    buf1 = copy.deepcopy(s)
    iAPID = buf1.sHdr.ccsdsHdr.sW1.uAPID
    iType = buf1.sHdr.ccsdsHdr.sW7.uFmtID
    iSeqCnt = buf1.sHdr.ccsdsHdr.uiPktSeq

谢谢。

安蒂·哈帕拉(Antti Haapala)

您复制的大多数代码都是字节交换int16_t值的一种非常复杂的方式struct模块可以轻松为您处理它,因此您不必担心它。

真正的问题是TLEDUMPHDR使用实际布局读取实际内容。假设您有一个具有以下布局的结构:

typedef struct TLEDUMPHDR {
    int32_t x;
    int16_t y;
    int16_t z;
} TLEDUMPHDR;

您正在从little-endian读取它,并将其写入big-endian。格式为是'ihh'; 大尾数的标记是>,小尾数的标记<因此我们得到:

import struct

buf = bytes([1,2,3,4,5,6,7,8])  # 8 bytes

from_big_endian = struct.unpack('>ihh', buf)
to_little_endian = struct.pack('<ihh', *from_big_endian)

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

压缩\解压缩二进制文件

使用Python解压缩二进制文件仅返回一个值

如何解压缩二进制文件,它是application / gzip并包含二进制文件-Linux

如何将二进制文件缓冲区解压缩为两个变量?

如何将解压缩后的值从二进制数据文件转换为python中的可用值

从二进制文件解压缩双精度值

解压缩包含重复的二进制文件

将二进制数据打包和解压缩到列表中的最快方法

Python解压缩二进制数据,长度为12的数字

从C#的zip文件中读取二进制文件,而无需将其解压缩

在AWS Lambda上运行IronPDF-无法将二进制文件解压缩到/ tmp(.NET / C#)

使用ifstream将二进制数据读入结构

有效地将向量解压缩到二进制矩阵Octave中

将二进制文件读入结构体以及字节序问题

将二进制文件数据读入结构列表

如何将二进制文件读入结构和反射 - Go 语言

Ruby-解压缩不规则的二进制字符串

在Julia中解压缩具有特定格式的二进制数据

PHP:从二进制数据流中解压缩32位整数

如何在Node JS中解压缩二进制数据

nodejs zlib 从套接字解压缩二进制数据

将二进制文件读入bash中的变量

将二进制文件读入字符串

将二进制文件读入MIPS中的数组

如何将二进制文件读入数组

将二进制文件读入int数组C ++

将二进制文件读入std :: vector <bool>

解压二进制文件内容;修改值;然后将内容打包到新的二进制文件中

.net:将二进制文件读入内存然后进行访问的有效方法