12

我有一个控件,其中包含一个字节数组。

不时有两个字节告诉我有关数组中未来项目数量的一些信息。

举个例子,我可以有:

...
...
项目 [4] = 7
项目 [5] = 0
...
...

这个值显然是 7。

但是这个呢?

...
...
项目 [4] = 0
项目 [5] = 7
...
...

知道这相当于什么(作为正常的 int)吗?

我转到二进制并认为它可能是 11100000000 等于 1792。但我不知道它是否真的是这样工作的(即它是否使用整个 8 个项目作为字节)。

有没有什么方法可以在没有测试的情况下知道这一点?

注意:我使用的是 C# 3.0 和 Visual Studio 2008

4

6 回答 6

23

BitConverter可以很容易地将两个字节转换为一个两字节整数值:

// assumes byte[] Item = someObject.GetBytes():
short num = BitConverter.ToInt16(Item, 4); // makes a short 
    // out of Item[4] and Item[5]
于 2010-04-18T00:48:18.830 回答
16

一个两字节的数字有一个低字节和一个高字节。高字节的价值是低字节的 256 倍:

value = 256 * high + low;

因此,对于 high=0 和 low=7,该值为 7。但对于 high=7 和 low=0,该值变为 1792。

这当然假设数字是一个简单的 16 位整数。如果它是更花哨的东西,上面的就不够了。然后,您需要更多关于数字如何编码的知识,以便对其进行解码。

高字节和低字节出现的顺序由字节流的字节序决定。在 big-endian 中,您会看到先高后低(在较低的地址),而在 little-endian 中则相反。

于 2010-04-17T22:07:10.693 回答
8

您说“这个值显然是 7”,但这完全取决于编码。如果我们假设全角字节,那么在小端,是的;7, 0 是 7。但在大端不是。

对于 little-endian,你想要的是

int i = byte[i] | (byte[i+1] << 8);

对于大端:

int i = (byte[i] << 8) | byte[i+1];

但也可以使用其他编码方案;例如,一些方案使用 7 位算术,第 8 位作为连续位。一些方案 (UTF-8) 将所有连续位放在第一个字节中(因此第一个字节只有有限的数据位空间),其余的 8 位在序列中。

于 2010-04-17T22:35:05.270 回答
2

如果您只是想以二进制格式将这两个字节彼此相邻,并查看该大数字是十进制,那么您需要使用以下代码:

if (BitConverter.IsLittleEndian)
{
    byte[] tempByteArray = new byte[2] { Item[5], Item[4] };
    ushort num = BitConverter.ToUInt16(tempByteArray, 0);
}
else
{
    ushort num = BitConverter.ToUInt16(Item, 4);
}

如果您short num = BitConverter.ToInt16(Item, 4);在接受的答案中使用,则假设这两个字节的第一位是符号位(1 = 负数,0 = 正数)。该答案还假设您使用的是大端系统。有关符号位的更多信息,请参阅此内容。

于 2015-03-04T06:11:33.037 回答
0

如果这些字节是整数的“部分”,它的工作方式就是这样。但请注意,字节顺序是特定于平台的,它还取决于整数的长度(16 位=2 字节,32 位=4 字节,...)

于 2010-04-17T22:07:17.060 回答
0

如果 item[5] 是 MSB

  1. ushort 结果 = BitConverter.ToUInt16(new byte[2] { Item[5], Item[4] }, 0);

  2. int 结果 = 256 * 项目[5] + 项目[4];

于 2017-12-14T14:48:49.447 回答