python - Python中用于网络数据包序列化的自定义位长变量
问题描述
我有 ac 结构,例如:
struct someStruct
{
signed deltaH:10;
signed x:19;
signed ph34:3;
signed y:19;
signed animation:10;
signed ph38:3;
signed z:19;
signed deltaY:13;
}
即由 UDP 数据包填充。
我试图在 Python 中重做整个事情,UDP 数据包转换为字节字符串,但我无法找到这些 n 位变量的等价物。到目前为止,我已经设法隔离了与我的变量相对应的位,但是将它们转换为int
, 例如int('011000101', 2)
并没有给我我期望的值。
我想过使用 cython 并在单独的文件中声明一个结构,虽然我什至不确定它是否有效,但我宁愿找到一种 Pythonic 方式来做到这一点。
任何想法?
编辑:我设法找到了解决方案。对于那些感兴趣的人:
x = int(f"{unpack('<h', payload[1:3])[0] >> 2:016b}", 2)
作为一个单行,它有点晦涩难懂,所以:
unpack('<h', payload[1:3])[0]
将“解包”(从结构导入解包)一个有符号的短(h
,<
意思是小端字节顺序 - 请参阅结构文档)来自对应于payload[1:3]
. [0]
因为 unpack 输出某种数组,所以这个短整数向右移动 2 位,因为这 2 位对应于变量的最后 2 位deltaH
(总共 10 位,请参见结构)。然后使用016b
格式(短整数为 16)将其转换为二进制字符串,然后使用int(bits_string, 2)
(二进制基数为 2)将其转换为整数。
解决方案
推荐阅读
- java - JMockit @Mocked 对象抛出 NPE
- html - 附加代码不适用于所有按钮
- php - odbc_connect():SQLerror:[Microsoft][ODBC Driver Manager]Datasource name not found and no default driver specified, SQL state IM002 in SQLConnect
- c# - 使用 c# --> asp.net web api 在 json 中获取分层输出
- postgresql - Postgres earthdistance'功能点(文本,文本)不存在'错误
- javascript - 基本 JavaScript 如何从 HTML 页面调用函数
- r - 逐列计算
- windows - 阻止 Windows 对 USB 存储器进行读/写操作,而应用程序仍然可以访问 USB 存储器
- javascript - 无法在异步函数中返回值
- arrays - 如何使用数组查找 excel 列并将找到的列移动到另一个工作表