我正在尝试解析一个我认为是UTF-16编码的文件(文件魔法是0xFEFF),我可以按照自己的意愿打开文件:
f = open(file, 'rb')
但是当我做的时候
print f.read(40)
它打印文件的实际unicode字符串,我想访问十六进制数据并逐字节读取。这可能是一个愚蠢的问题,但我无法找到如何做到这一点。
另外,作为后续问题。一旦我得到这个工作,我想解析文件寻找一组特定的字节,在这种情况下:
0x00 00 00 43 00 00 00
找到该模式后,开始解析一个条目。实现这一目标的最佳方法是什么?我正在考虑使用生成器遍历每个字节,一旦这个模式出现,产生字节直到该模式的下一个实例?有没有更有效的方法来做到这一点?
编辑:我使用的是Python 2.7
答案 0 :(得分:1)
你不应该只能做到这一点
string = 'string'
>>> hex(ord(string[1]))
'0x74'
hexString = ''
with open(filename) as f:
while True:
#char = f.read(1)
chars = f.read(40)
hexString += ''.join(hex(ord(char) for char in chars)
if not chars:
break
答案 1 :(得分:1)
如果你想要一个十六进制的字符串,你可以通过binascii.hexlify()
传递它:
with open(filename, 'rb') as f:
raw = f.read(40)
hexadecimal = binascii.hexlify(raw)
print(hexadecimal)
(这在Python 3上无需修改即可使用)
如果你需要每个字节的数值,你可以在每个元素上调用ord()
,或者相当于map()
字符串上的函数:
with open(filename, 'rb') as f:
raw = f.read(40)
byte_list = map(ord, raw)
print byte_list
(这不适用于Python 3,但在3.x上,您可以直接迭代raw
)