Python:将二进制文件读入结构然后解包

标签 python c++ endianness

我正在将 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

谢谢。

最佳答案

您复制的大部分代码都是一种非常复杂的字节交换方式 int16_t值(value)观。 struct 模块可以轻松为您处理,因此您无需担心。

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

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

并且您正在从小端读取它并将其写入大端。 format因为那是'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)

关于Python:将二进制文件读入结构然后解包,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29191471/

相关文章:

c++ - 使用指向 STL vector 的指针是个好主意吗?

c# - 访问 BinaryReader 的内部缓冲区

python - Django 本地化日期解析

python - TypeError : request() got an unexpected keyword argument 'header' - when i use header, 403 错误 - 没有 header

python - 反斜杠转义在 Python 中不起作用

c++ - 使用 mkdir() 创建文件夹后,如何让程序将文件和其他信息保存到新文件夹中

python - 用 pandas csv 读取的文本定义正确的分隔符

c++ - 为什么在x86上对自然对齐的可变原子进行整数赋值?

c++ - 为什么结构字节中位字段的顺序不是由语言本身定义的?

c - 测试大端