【问题标题】:C# integer masking into byte arrayC#整数掩码成字节数组
【发布时间】:2011-05-04 19:34:17
【问题描述】:

我很困惑为什么这不起作用,有人可以提供一些见解吗?

我有一个接收整数值的函数,但想将十六进制值的高两位存储到字节数组元素中。

假设距离是 (24,135)10 还是 (5E47)16

public ConfigureReportOptionsMessageData(int Distance, int DistanceCheckTime)
    {
        ...
        this._data = new byte[9];
        this._data[0] = (byte)(Distance & 0x00FF); // shows 47
        this._data[1] = (byte)(Distance & 0xFF00); // shows 00
        this._data[2] = (byte)(DistanceCheckTime & 0xFF);
        ...
    }

【问题讨论】:

  • 你忘记了位移...
  • 顺便说一句 - 你对距离中的其他 2 个字节做了什么?
  • @Reed Copsey:没什么,有一个最大值。如果是米,限制是 30,000。

标签: c# arrays byte masking


【解决方案1】:
this._data[1] = (byte)(Distance >> 8);

?

【讨论】:

  • (字节)(距离 >> 8),而不是(字节)(距离 >> 16)
【解决方案2】:

您似乎应该使用BitConverter.GetBytes - 它会提供一个更简单的选项。

【讨论】:

  • 我认为他注意到了一个 9 字节的数组。然后 BitConverter.GetBytes 需要一个 Array.Copy 或 Buffer.Copy。
  • @codekaizen:是的,但我仍然会说它更易于维护,因为它正在做什么很明显。
  • 我有点不同意。在编写和维护二进制协议处理程序之后,使用 BitConverter 就不太容易维护了。也让我感到惊讶。
  • @codekaizen:是的 - 取决于您的数据流如何进入例程。在这种情况下,从 int 转换为 byte - 我更喜欢使用 BitConverter 维护某人的代码而不是 bitshifting - 特别是考虑到它要进入一个大数组。意图更容易理解。
【解决方案3】:

_data[1] 得到 0 的原因是,当您转换为 byte 时,前 3 个字节丢失了。

您的中间结果如下所示:

Distance && 0xff00 = 0x00005e00;

当它转换为字节时,你只保留低位字节:

(byte)0x00005e00 = 0x00;

你需要移位8位:

0x00005e00 >> 8 = 0x0000005e;

在转换为 byte 并分配给 _data[1] 之前

【讨论】:

  • 感谢您的澄清!
猜你喜欢
  • 2013-12-03
  • 2023-03-09
  • 2021-10-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多