将2个字节转换为数字

时间:2010-04-17 22:01:51

标签: c# binary bytearray byte twos-complement

我有一个控件,里面有一个字节数组。

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

作为一个例子我可以:

...
...
Item [4] = 7
Item [5] = 0
...
...

这个值显然是7。

但是这个怎么样?

...
...
Item [4] = 0
Item [5] = 7
...
...

关于什么等同于(作为普通的int)?

我去了二进制文件并且认为它可能是11100000000等于1792.但是我不知道它是否真的有效(即它是否使用了整个8项的字节)。

有没有办法通过测试来了解这一点?

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

6 个答案:

答案 0 :(得分:20)

BitConverter可以轻松地将两个字节转换为两个字节的整数值:

// assumes byte[] Item = someObject.GetBytes():
short num = BitConverter.ToInt16(Item, 4); // makes a short 
    // out of Item[4] and Item[5]

答案 1 :(得分:11)

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

value = 256 * high + low;

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

这当然假设该数字是一个简单的16位整数。如果有什么比这更好的话,以上就不够了。然后,您需要有关如何编码数字的更多知识,以便对其进行解码。

高字节和低字节的出现顺序由字节流的endianness决定。在big-endian中,你会看到很高的低点(在较低的地址),而在little-endian中则是另一种方式。

答案 2 :(得分:7)

你说“这个值显然是7”,但它完全取决于编码。如果我们假设全宽字节,那么在little-endian中,是的; 7,0是7.但是在big endian中它不是。

对于小端,你想要的是

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

和big-endian:

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

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

答案 3 :(得分: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 =正数)。该答案还假设您正在使用大端系统。有关符号位的详细信息,请参阅this

答案 4 :(得分:0)

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

答案 5 :(得分:0)

如果项目[5]是MSB

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

  2. int result = 256 * Item [5] + Item [4];