【问题标题】:Unpacking byte values in Python在 Python 中解包字节值
【发布时间】:2020-01-28 20:08:12
【问题描述】:

我正在尝试解压缩以下数据,但似乎无法弄清楚。 这是从设备读取仪表值的数字混音器返回的字节数据。

文档建议返回的 blob 将被格式化为:

  • int1 – blob 的长度,以字节为单位,32 位整数 big-endian
  • int2 - 'nativefloats' 的数量,32 位整数 little-endian
  • ‘nativefloat’ – 米值,32 位浮点小端序
  • ‘nativefloat’
  • …(在此特定消息中应该总共有 70 个“nativefloat”值)

执行打印(数据)会显示来自设备的实时数据中的以下 blob:

['F\x00\x00\x00\xd4\xc6\x9a7\xce-\xee8G\xa6=6\x88\x80X7\x83\x99#7\xd1\xd3A7\x88\x80X7\x8cM\x9d7\x9b\xeeK7\xeb,\x847\xd4\xc6\x9a7*q\x8a7dlN7=\xfcU7\xd1\xde\x9f7\xdc\xa4\x817q=\x937b\x9cg7\x1d\xba77\x9b\xeeK7x\xb8q7\x1d^\x807\xe1P?7\x90H\xba7\x1d^\x807o\x86]7\xf8\xf1P7\x88\x80X7\xc5\xa8\xa87:\xdcF7\xdc\x1fe7TaI7\x01\t\xb87.\xebW7\xca\xf3a7\xd6\xef[7=\xfbQ7\xe8\xfa\x957n\xbb\xd54n\xbb\xd54n\xbb\xd54n\xbb\xd54n\xbb\xd54n\xbb\xd54n\xbb\xd54n\xbb\xd54n\xbb\xd54n\xbb\xd54\x9d\xa2\x867n\xbb\xd54n\xbb\xd54n\xbb\xd54n\xbb\xd54n\xbb\xd54n\xbb\xd54n\xbb\xd54n\xbb\xd54n\xbb\xd54n\xbb\xd54n\xbb\xd54n\xbb\xd54n\xbb\xd54n\xbb\xd54n\xbb\xd54\x1e\x93\x867n\xbb\xd54n\xbb\xd54n\xbb\xd54n\xbb\xd54n\xbb\xd54']

我尝试了struct.unpack 的几种变体,但收到“结构格式中的错误字符”,并且文档中没有任何示例讨论与此类似的布局。我还尝试提取字节并使用在线转换器对其进行转换,但无法获得任何类似于预期值的内容。我确定我误解了一些简单的事情?

【问题讨论】:

  • 您能分享一下您尝试过的方法和收到的错误吗?
  • 欢迎来到 Stack Overflow!我将您的输出样本缩进了 4 个空格,以便正确呈现 - 请参阅editing help 以获取有关格式的更多信息。

标签: python arrays python-2.7


【解决方案1】:

int1 上面的示例中缺少。它以 little-endian 的 70 开头,然后以 70 个浮点数继续。所以你可以用以下方式解压它:

int2 = int(*unpack('<i', data[:4]))
floats = unpack('<' + int2*'f', data[4:])

如果开头有int1(如提供的规范中所述),那么您可以使用

int1 = int(*unpack('>i', data[:4]))
int2 = int(*unpack('<i', data[4:8]))
floats = unpack('<' + int2*'f', data[8:])

【讨论】:

  • 这正是我所需要的!我很好奇你是如何阅读这篇文章来确定 int1 丢失的?
  • 有两个提示:数据的长度(len(data) / 4 = 71,而不是 72)和解码大端的前 4 个字节产生 1174405120,这显然不是长度字节流,而在小端解码时产生 70,这对于 int2 是有意义的。
  • 我明白了!我试图使用在线转换器,它不会显示任何接近这些数字的东西。直接在 python 中进行操作,我可以准确地重现您所展示的内容。谢谢!
猜你喜欢
  • 2017-12-26
  • 1970-01-01
  • 2020-07-17
  • 1970-01-01
  • 2020-10-24
  • 2023-02-25
  • 1970-01-01
  • 2019-02-13
  • 1970-01-01
相关资源
最近更新 更多