首页 > 解决方案 > 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)将其转换为整数。

标签: pythonnetworkingserializationstructbit

解决方案


推荐阅读