簡體   English   中英

Python:將二進制文件讀入結構,然后解壓縮

[英]Python: Reading binary file into a structure and then unpacking

我正在將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值的非常復雜的方法。 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)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM