如何以Big Endian读取和解析二进制文件

时间:2018-10-09 05:42:30

标签: python

我有一个二进制文件,其中包含多种类型的结构。 该文件包含的数据为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")

问题是使用readcast函数时,应使用Little Endian而不是Big Endian。

如何阅读或投放到Big Endian?

1 个答案:

答案 0 :(得分:1)

ctypes.Structure用于本机字节顺序。

ctypes.BigEndianStructure而不是ctypes.Structure派生,但要注意the documentation中的警告:

  

具有非本地字节顺序的结构不能包含指针类型字段或任何其他包含指针类型字段的数据类型。