我有一个二进制文件,其中包含多种类型的结构。 该文件包含的数据为BIG Endian。
我正在尝试读取文件并打印文件中的记录总数。 (有多种类型的结构,每种结构都有不同的大小)
这里是我的代码示例:
import os
from ctypes import *
class Header(Structure):
_fields_ = [("time", c_ushort),
("typeA", c_ubyte, 4),
("typeB", c_ubyte, 4),
("size", c_ushort)]
headerSize = sizeof(Header)
file = open("D:\binaryFile.bin", "rb")
numOfRecords = 0
while 1:
# read the header
sizeToRead = headerSize
data = file.read(sizeToRead)
# if we get to the end of the file
if not data: break
numOfRecords = numOfRecords + 1
# cast the data into Header structre
headerInstance = cast(data, POINTER(Header)).contents
# print the msg size (msg size = header size + payload size)
print ("size = ", headerInstance.size)
# read the rest of the body (payload size)
sizeToRead = headerInstance.size - headerSize
data = file.read(sizeToRead)
print ("Finished with: ", numOfRecords, " Records")
问题是使用read
或cast
函数时,应使用Little Endian而不是Big Endian。
如何阅读或投放到Big Endian?
答案 0 :(得分:1)
ctypes.Structure
用于本机字节顺序。
从ctypes.BigEndianStructure
而不是ctypes.Structure
派生,但要注意the documentation中的警告:
具有非本地字节顺序的结构不能包含指针类型字段或任何其他包含指针类型字段的数据类型。