我正在将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)
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句