在Python中解包字节值

2024-06-26 13:48:02 发布

您现在位置:Python中文网/ 问答频道 /正文

我正试图解开下面的数据,但似乎无法找出它。 这是从数字混音器返回的字节数据,从设备读取仪表值

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

  • int1–blob的长度(字节),32位整数big endian
  • int2–nativefloats的数量,32位整数little endian
  • “nativefloat”–仪表值,32位浮点小端点
  • '本地浮动'
  • …(在此特定消息中,应为总共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的几种变体,但收到的是“结构格式中的坏字符”,文档中没有任何示例谈到类似于此的布局。我也尝试过提取字节并使用在线转换器进行转换,但无法得到任何与预期值类似的值。我肯定有些简单的事情我误解了


Tags: 数据文档字节仪表整数blobx00endian
1条回答
网友
1楼 · 发布于 2024-06-26 13:48:02

上面的示例中缺少int1。它从小端点的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:])

相关问题 更多 >