首页 > 解决方案 > Python中c-struct的反向解码功能

问题描述

我正在使用 GitHub 上的这个函数从 Python 中的 HID 流中读取一些数据。h.read(64)

def decode_bytes(byte_1, byte_2, byte_3, byte_4):
    bytes_reversed_and_concatenated = byte_4 * (16 ** 6) + byte_3 * (16 ** 4) + byte_2 * (16 ** 2) + byte_1

    bytes_hex = hex(bytes_reversed_and_concatenated)[2:]

    bytes_decimal = str(round(struct.unpack('!f', bytes.fromhex(bytes_hex))[0], 1))

    return bytes_decimal

该函数将流中的四个字节(以十六进制值作为整数)转换为 Python 浮点值,该浮点值作为字符串返回。我读过 C-struct 浮点表示占用四个字节,所以我想这解释了该函数需要四个字节作为输入。但除此之外,我对该功能的工作方式和原因一无所知。

我有两个问题:

首先,我非常想更好地了解该功能的工作原理。为什么它会颠倒字节顺序以及 16 ** 6、16 ** 4 等等是怎么回事?我很难弄清楚这在 Python 中做了什么。

其次,我想反转功能。这意味着我希望能够提供一个浮点数作为输入并得到一个包含四个整数十六进制值的列表,我可以通过 HID 接口将其写回。但我不知道,从哪里开始。

我希望能在正确的方向上得到一些指示。任何帮助深表感谢。

标签: pythonchid

解决方案


所以@user2357112 的评论帮助我弄清楚了一切。工作和更简单的功能现在看起来像这样:

def decode_bytes(byte_1, byte_2, byte_3, byte_4):

    return_value = struct.unpack('<f', bytes([byte_1, byte_2, byte_3, byte_4]))
    return str(round(return_value[0], 1))

如果我想将浮点数包装为字节数组,我会这样做:

struct.pack('<f', float(float_value))

在此过程中,我还学到了一些关于字节序的知识。谢谢。


推荐阅读