我一直在尝试使用蓝牙模块来发送数据。数据包含 3 个旋转(0-360)和 3 个按钮状态(位(0 或 1))。
我尝试将其映射到一个字符串中(即:360_52_265_010%:x_y_z_bbb%,其中%是结束数据流的标记),但发送它实际上需要16个字节(或多或少),因为每个小字母都是一个字符(8 位)...
这是 Not Acceptable 。我有一个我无法容忍的小延迟,所以我想出了这个想法:
- 一个旋转轴 = 9 位数据,因为最大值为 360,最多占用 9 位
- 我们需要 3 次旋转 + 3 位用于按钮状态,因此总计为 30 位。
- 在互联网上搜索最佳数据类型,Google 给了我一个 float (32 位)
现在我正在考虑将所有这些值映射到一个浮点中,因为通过蓝牙连接,4 字节远远胜过 17 字节(我认为)
为了更好地解释,我对我认为应该有效的内容做了一个漂亮的表示:
现在,我在位移方面的经验为 0。好吧,我知道主要概念,但我似乎无法让它发挥作用。我看了其他几个帖子here和 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(编辑这是错误的,由于将其打印到我的控制台,该值已从字符转换为字符串)
所以我想知道是否有人可以帮助我将这些值打包到一个 float 中并返回到我的原始数据。
感谢您的帮助!
最佳答案
使用unsigned long
而不是float
,或者任何您知道的机器中4字节宽的无符号整数类型。你所有的类次都减少了一位。应该是:
(xx << 21 | yy << 12 | zz << 3 | rr << 2 | ll << 1 | tt);
关于c - 打包多个值的二元运算,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36811811/