【问题标题】:Convert to lower and upper bits转换为低位和高位
【发布时间】:2013-11-03 01:17:56
【问题描述】:

我有一个设备,我有一些用户在 GUI 中设置的值,例如 630 330 等。我需要将这些值传递给 I2C 字节。 583 将是十六进制位中的02 47。这将是 2 个字节的变量,我需要调用 Set(byte lower ,byte upper),因此需要将 int 或 double 值转换为 2 个字节。

我试过了:

            ushort R1x = (ushort)Rx;
            byte upper = (byte)(R1x >> 8);
            byte lower = (byte)(R1x & 0xff);

我需要的是lower = 47,upper = 02。

这是给lower = 0upper = 247 ..我可以知道我做错了什么

【问题讨论】:

  • ushort Rx = 245 * 256 + 130; 尝试过,效果很好。也许给额外的代码?
  • 我没听懂你说的。我实际上错过了逻辑。
  • 您从 16 位值中获取高位和低位 8 位的方法是正确的,但您仍然弄错了 lowerupper,IMO 有一些关于 R1x 的意外情况价值。
  • 您可以删除& 0xFF。转换为字节只保留最后 8 位,因为一个字节只有 8 位...
  • “我需要的是lower = 47和upper = 02。” - 我对此表示怀疑。这将意味着十进制拆分,这在低级协议中非常不寻常。

标签: c# byte


【解决方案1】:

它可以为Rx = 247 提供lower = 0upper = 247,因为ushort 是16 位值,而247 适合8 位。这就是为什么高 8 位为零(不需要保存 247)而低位保存整数,即 247 或二进制的00000000 11110111

第一个非零高位数字是 256 (00000001 00000000),其中:

upper = 1
lower = 0

要拥有upper = 47,你需要逆向这个过程,所以让我们把它写成一个8位二进制数:00101111。然后将这 8 位作为 16 位数字的高位:00101111 00000000。由于您想要lower = 2,我们需要将 2 放入正确的 8 位中。这给出了00101111 00000010 二进制,等于十进制的 12034。

不确定您要实现什么,但是对于您提供的代码Rx = 12034 是唯一可能使上限和下限等于您想要的。因此,如果这不适合您的协议,那么您在其他地方犯了错误。

【讨论】:

    猜你喜欢
    • 2021-08-15
    • 1970-01-01
    • 1970-01-01
    • 2017-04-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-15
    • 1970-01-01
    相关资源
    最近更新 更多