用于打包多个值的二进制操作

时间:2016-04-23 14:05:16

标签: c bluetooth bit byte-shifting

我一直在玩蓝牙模块来发送数据。数据包含3个旋转(0-360)和3个按钮状态(位(0或1))。

我尝试将其映射为字符串(即:360_52_265_010%:x_y_z_bbb%,其中%是结束数据流的标记)但发送此实际上最多需要16个字节(或多或少),因为每个小字母都是char(8bits)...

这是不可接受的。我有一点我不能容忍的延迟,所以我提出了这个想法:

  • 一个旋转轴= 9位数据,因为maxvalue为360,最多占用9位
  • 按钮状态需要3次旋转+3位,因此最多可添加30位。
  • 搜索了最佳数据类型的互联网,谷歌给了我一个浮点数(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(编辑这是错误的,由于将字符打印到我的控制台,此值已从字符转换为字符串)

所以我想知道是否有人可以帮助我将这些值包装到一个浮点数并返回原始数据。

感谢您的帮助!

1 个答案:

答案 0 :(得分:1)

使用unsigned long代替float,或者您知道的任何无符号整数类型在您的计算机中是4个字节宽。你所有的轮班都是一个人。它应该是:

(xx << 21 | yy << 12 | zz << 3 | rr << 2 | ll << 1 | tt);