【问题标题】:Binary operations to pack mutliple values打包多个值的二进制操作
【发布时间】:2016-04-23 14:05:16
【问题描述】:

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

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

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

  • 一个旋转轴 = 9 位数据,因为最大值为 360,最多占用 9 位
  • 我们需要 3 次旋转 + 3 位按钮状态,因此加起来是 30 位。
  • 在互联网上搜索最佳数据类型,谷歌给了我一个浮点数(32 位)

现在我正在考虑将所有这些值映射到一个浮点数中,因为通过蓝牙连接,4 个字节远远超过 17 个字节(我认为)

为了更好地解释,我对我认为应该起作用的东西做了这个漂亮的表示:

现在,我在位移方面的经验为 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 使用二进制操作吗?你为什么要这么做?
  • 我应该使用整数吗?
  • 使用适当的结构。

标签: c bluetooth bit byte-shifting


【解决方案1】:

使用unsigned long 而不是float,或者你知道的任何无符号整数类型在你的机器中是4 字节宽。你所有的班次都减一。应该是:

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

【讨论】:

  • 是的!另外,我提取的值是错误的。很多事情都失控了,但这完美无缺!
猜你喜欢
  • 2014-01-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-03-31
  • 2011-10-01
  • 2021-07-25
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多