c - 打包多个值的二元运算

标签 c bluetooth bit byte-shifting

我一直在尝试使用蓝牙模块来发送数据。数据包含 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 字节(我认为)

为了更好地解释,我对我认为应该有效的内容做了一个漂亮的表示: enter image description here

现在,我在位移方面的经验为 0。好吧,我知道主要概念,但我似乎无法让它发挥作用。我看了其他几个帖子herehere但面具让我困惑。

所以我就去做了,并尝试了这段小代码:

    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/

相关文章:

c - 将结构添加到 C 中的 char 数组

c - 使用 C 在 Visual Studio 2013 中的输出窗口中显示当前时间

ios:如何使用音频队列从蓝牙耳机录音?

c - 使用 scanf 读取 uint8_t 数据

c - 为什么我不能在 C 中返回递归函数的最后一个值?

c - 如何捕获系统范围内加载的库?

ios - scanForPeripheralWithServices 不返回任何东西

java - 使用蓝牙设备自动连接至 Android 手机

c - 在 C 和汇编中移动

c - 如何一次访问连续的结构体位字段成员?