读取40个字节的二进制数据作为ascii文本

时间:2010-08-18 00:00:06

标签: python

我有一些二进制数据,在十六进制编辑器中看起来像: s.o.m.e.d.a.t.a

每个字母之间都有所有这些点

当我用filehandle.read阅读时(40) 它显示了这些点

我知道点不应该在那里,有没有办法用struct解包一些长度为40字节的ascii数据?

我尝试了'40s'和's',但它显示了奇怪的数据,或只解包1个字符而不是40个。

3 个答案:

答案 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 )