我有一些二进制数据,在十六进制编辑器中看起来像: s.o.m.e.d.a.t.a
每个字母之间都有所有这些点
当我用filehandle.read阅读时(40) 它显示了这些点
我知道点不应该在那里,有没有办法用struct解包一些长度为40字节的ascii数据?
我尝试了'40s'和's',但它显示了奇怪的数据,或只解包1个字符而不是40个。
答案 0 :(得分:4)
如果您的第一个字节是ASCII字符(如您的示例所示),而您的第二个字节是'\ x00',那么您可能将数据编码为UTF-16LE。
但是,如果您明确地向我们展示了文件的前几个字节中的内容,那将是一个好主意。请这样做:
python -c "print(repr(open('myfile.txt', 'rb').read(20)))"
并编辑您的问题以向我们展示结果。如果任何文本是保密的,请在编辑时保留意义。
我们特别感兴趣的是,它是否以UTF-16 BOM('\xff\xfe'
或'\xfe\xff'
)开头。
对于后台,你在哪个平台(Windows或Linux)上?是什么产生了文件?
更新我对你的声明感到有点困惑“”“我试过'40s'和's'但是它显示了奇怪的数据,或者只解包了1个字符而不是40个字符。 “”“检查以下示例:
>>> data = "q\x00w\x00"
>>> unpack("4s", data)
('q\x00w\x00',) # weird? it's effectively tuple([data])
>>> unpack("s", data)
# doesn't produce a string of length 1
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
struct.error: unpack requires a string argument of length 1
>>> unpack("ssss", data)
('q', '\x00', 'w', '\x00') # this == tuple(data)
>>>
@pxh评论“”“您只获得一个字符,因为这些点被读取为ASCII NUL(因此终止字符串)。”“”我非常怀疑是否@ pxh实际上可以证明struct.unpack对"s"
格式的使用以任何方式取决于数据中的单个字节值,无论NUL
("\x00"
)还是其他任何内容。
答案 1 :(得分:1)
快速而肮脏的解决方案是使用s[::2]
,其中s
是80个字符的字节字符串,您只想考虑备用字节。根据@fadden的评论,“干净:解决方案”可能是将数据读入UTF-16
(然后.encode
将其读取为ASCII等),但如果Q&amp; D符合您的目的,它可能更简单,更快(如果原始数据的字符不在最低256范围内,Q&amp; D方法将产生奇怪的结果,而正确的方法会引发异常 - 这种处理更好取决于你的应用...)。
答案 2 :(得分:0)
为了在python中读取二进制数据,我正在使用:
val = f.read(1)
val = struct.unpack( 'c' , val )
并且逐字节地读取我需要的所有内容。 对于40字节的结构,我将是
val = f.read(40)
val = struct.unpack( '40c' , val )