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

2024-09-29 18:29:55 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在将一个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代码:

^{pr2}$

谢谢。在


Tags: 文件代码二进制结构bigpbbufendian
1条回答
网友
1楼 · 发布于 2024-09-29 18:29:55

您复制的大多数代码都是一种非常复杂的字节交换int16_t值的方法。^{}模块可以很容易地为您处理它,所以您不必担心它。在

真正的问题是使用实际布局读取实际的TLEDUMPHDR。 例如,您有一个具有以下布局的结构:

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

你读的是小端音,写的是大端音。它的format'ihh';大端号的标志是>,小端号是{};因此我们得到:

^{pr2}$

相关问题 更多 >

    热门问题