【问题标题】:Decoding String list in python from a binary file从二进制文件中解码python中的字符串列表
【发布时间】:2019-08-01 11:36:53
【问题描述】:

我需要从二进制文件中读取字符串列表并创建一个 python 列表。

我正在使用以下命令从二进制文件中提取数据:

tmp = f.read(100) 
abc, = struct.unpack('100c',tmp) 

我在变量'abc'中看到的数据完全如下图所示,但我需要将以下数据作为字符串获取到python列表中。

我需要作为列表的数据:'UsrVal''VdetHC''VcupHC'.....'Gravity_Axis'

b'UsrVal\x00VdetHC\x00VcupHC\x00VdirHC\x00HdirHC\x00UpFlwHC\x00UxHC\x00UyHC\x00UzHC\x00VresHC\x00UxRP\x00UyRP\x00UzRP\x00VresRP\x00Gravity_Axis'

【问题讨论】:

  • 我刚刚做了类似的事情,我使用了命令行包strings,效果很好。
  • 你已经完成了一半,你只需要拆分字节
  • 你没有尝试过显而易见的事情吗? abc.split(b'\x00')?
  • 当我尝试 abc.split(b'\x00') 时,我得到前面带有 'b' 的值,例如 b'Usrval、b'VdetHC 等...如何删除那个' b',请原谅我在处理二进制文件方面知识不足。

标签: python python-3.x binary-data non-ascii-characters


【解决方案1】:

以下是我建议您使用一个班轮的方法。

您需要解码二进制字符串,然后您可以根据"\x00" 进行拆分,这将返回您要查找的列表。

例如

my_binary_out = b'UsrVal\x00VdetHC\x00VcupHC\x00VdirHC\x00HdirHC\x00UpFlwHC\x00UxHC\x00UyHC\x00UzHC\x00VresHC\x00UxRP\x00UyRP\x00UzRP\x00VresRP\x00Gravity_Axis'
decoded_list = my_binary_out.decode("latin1", 'ignore').split('\x00')
#or 
decoded_list = my_binary_out.decode("cp1252", 'ignore').split('\x00')

输出将如下所示:

['UsrVal', 'VdetHC', 'VcupHC', 'VdirHC', 'HdirHC', 'UpFlwHC', 'UxHC', 'UyHC', 'UzHC', 'VresHC', 'UxRP', 'UyRP', 'UzRP', 'VresRP', 'Gravity_Axis']

希望对你有帮助

【讨论】:

  • 我在这段代码中遇到了另一个问题,因为我的字符串中有字符 ²(2 的幂,而不是 ^2,它是 ²,如 m/s²)。
  • 我在这段代码中遇到了另一个问题,因为我的字符串中有字符 ²(2 的幂,而不是 ^2,它是 ²,如 m/s²)。现在我的字符串是: b'-\x00deg/s^2\x00m/s^2\x00m/s^2\x00rpm\x00m/s\xb2\x00m/s\xb2\x00m/s\xb2\x00m/s \xb2\x00m/s\xb2\x00m/s\xb2\x00deg' 当我检查 ord('²') 时,它是 178,供您参考。请帮我解决这个问题。
  • 我看到的错误信息是,UnicodeDecodeError: 'utf-8' codec can't decode byte 0xb2 in position 595: invalid start byte
  • 我已经修复了解码错误,我假设您不想获得“0xb2”的解码值,即my_binary_out.decode('utf-8', 'ignore').split('\x00'),它应该会给您想要的值['-', 'deg/s^2', 'm/s^2', 'm/s^2', 'rpm', 'm/s', 'm/s', 'm/s', 'm/s', 'm/s', 'm/s', 'deg']
  • 如果它解决了问题以帮助他人,请接受答案:)
【解决方案2】:

如果你想在这里快速而凌乱的方式,并假设你的字符串

b'UsrVal\x00VdetHC\x00VcupHC\x00VdirHC\x00HdirHC\x00UpFlwHC\x00UxHC\x00UyHC\x00UzHC\x00VresHC\x00UxRP\x00UyRP\x00UzRP\x00VresRP\x00Gravity_Axis'

实际上被解释为

" b'UsrVal\x00VdetHC\x00VcupHC\x00VdirHC\x00HdirHC\x00UpFlwHC\x00UxHC\x00UyHC\x00UzHC\x00VresHC\x00UxRP\x00UyRP\x00UzRP\x00VresRP\x00Gravity_Axis' " >

然后下面几行代码的结果是 'b' 有你想要的数组。

a = {YourStringHere}
b = a[2:-1].split("\x00")

【讨论】:

    猜你喜欢
    • 2012-09-05
    • 2017-01-15
    • 2015-07-02
    • 2015-08-07
    • 2014-03-30
    • 1970-01-01
    • 2014-01-19
    • 2014-06-18
    相关资源
    最近更新 更多