python - 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 接口将其写回。但我不知道,从哪里开始。
我希望能在正确的方向上得到一些指示。任何帮助深表感谢。
解决方案
所以@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))
在此过程中,我还学到了一些关于字节序的知识。谢谢。
推荐阅读
- node.js - 仅从前端而不是从 MongoDB 中删除项目
- javascript - 删除数组内对象中的重复键并汇总每个状态Javascript的总数
- java - 问题调试生产者消费者问题
- c++ - 使用 C++ 解析复杂的文本文件
- javascript - 引导电子邮件输入中的wordpress jetpack不需要的边框
- java - 包含链接文本的下拉列表中的 getText() 返回空字符串
- python - 如何链接散景输入/控件以过滤数据?无法弄清楚如何使输入过滤掉视觉中显示的值
- php - 如何在实体实例中检索请求或语言环境?
- sql - 需要帮助在 Postgres 函数中设置 Json 键值
- php - 由于目标机器主动拒绝,无法建立连接。Laravel 5.7 尝试连接 MsSQL 服务器