打包多个值的二进制操作
Binary operations to pack mutliple values
我一直在研究用于发送数据的蓝牙模块。数据包含 3 个旋转 (0-360) 和 3 个按钮状态(位(0 或 1))。
我尝试将它映射到一个字符串中(即:360_52_265_010% : x_y_z_bbb% 其中 % 是结束数据流的标记)但发送它实际上最多需要 16 个字节(或多或少)因为每个小字母都是一个字符(8位)...
这是不可接受的。我有一个我不能容忍的小延迟,所以我想出了这个主意:
- 一个旋转轴=9位数据,因为maxvalue是360,最多占9位
- 我们需要 3 次旋转 + 3 位按钮状态,所以加起来就是 30 位。
- 在网上搜索了最佳数据类型,google 给了我一个浮点数(32 位)
现在我正在考虑将所有这些值映射到一个浮点数中,因为通过蓝牙连接 4 个字节远远超过 17 个字节(我认为)
为了更好的解释,我对我认为应该起作用的东西做了这个漂亮的表示:
现在,我有 0 个位移位经验。好吧,我知道主要概念,但我似乎无法让它发挥作用。我查看了其他一些帖子 here and here,但面具让我感到困惑。
所以我就这么做了,并尝试了这段代码:
int xx = 270, yy = 5, zz = 26;
//3 buttons; left, right, and trigger. I used a byte cause I actually have no idea how I could store just one bit
byte ll = 0, rr = 0, tt = 1;
//in here I tried to bitshift the values. Hence the word tried :(
float packed = (float)(xx << 22 | yy << 13 | zz << 4 | rr << 3 | ll << 2 | tt << 1);
这吐出一个浮点值 67113578(编辑这是错误的,由于将它打印到我的控制台,这个值从字符转换为字符串)
所以我想知道是否有人可以帮助我将这些值打包成一个浮点数并返回到我的原始数据。
感谢您的帮助!
使用 unsigned long
而不是 float
,或者您知道在您的机器中是 4 字节宽的任何无符号整数类型。你所有的班次都减一班。应该是:
(xx << 21 | yy << 12 | zz << 3 | rr << 2 | ll << 1 | tt);
我一直在研究用于发送数据的蓝牙模块。数据包含 3 个旋转 (0-360) 和 3 个按钮状态(位(0 或 1))。
我尝试将它映射到一个字符串中(即:360_52_265_010% : x_y_z_bbb% 其中 % 是结束数据流的标记)但发送它实际上最多需要 16 个字节(或多或少)因为每个小字母都是一个字符(8位)...
这是不可接受的。我有一个我不能容忍的小延迟,所以我想出了这个主意:
- 一个旋转轴=9位数据,因为maxvalue是360,最多占9位
- 我们需要 3 次旋转 + 3 位按钮状态,所以加起来就是 30 位。
- 在网上搜索了最佳数据类型,google 给了我一个浮点数(32 位)
现在我正在考虑将所有这些值映射到一个浮点数中,因为通过蓝牙连接 4 个字节远远超过 17 个字节(我认为)
为了更好的解释,我对我认为应该起作用的东西做了这个漂亮的表示:
现在,我有 0 个位移位经验。好吧,我知道主要概念,但我似乎无法让它发挥作用。我查看了其他一些帖子 here and here,但面具让我感到困惑。
所以我就这么做了,并尝试了这段代码:
int xx = 270, yy = 5, zz = 26;
//3 buttons; left, right, and trigger. I used a byte cause I actually have no idea how I could store just one bit
byte ll = 0, rr = 0, tt = 1;
//in here I tried to bitshift the values. Hence the word tried :(
float packed = (float)(xx << 22 | yy << 13 | zz << 4 | rr << 3 | ll << 2 | tt << 1);
这吐出一个浮点值 67113578(编辑这是错误的,由于将它打印到我的控制台,这个值从字符转换为字符串)
所以我想知道是否有人可以帮助我将这些值打包成一个浮点数并返回到我的原始数据。
感谢您的帮助!
使用 unsigned long
而不是 float
,或者您知道在您的机器中是 4 字节宽的任何无符号整数类型。你所有的班次都减一班。应该是:
(xx << 21 | yy << 12 | zz << 3 | rr << 2 | ll << 1 | tt);