[英]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.