我有一个控件,里面有一个字节数组。
偶尔会有两个字节告诉我有关数组中未来项目数量的一些信息。
作为一个例子我可以:
... ... Item [4] = 7 Item [5] = 0 ... ...
这个值显然是7。
但是这个怎么样?
... ... Item [4] = 0 Item [5] = 7 ... ...
关于什么等同于(作为普通的int)?
我去了二进制文件并且认为它可能是11100000000等于1792.但是我不知道它是否真的有效(即它是否使用了整个8项的字节)。
有没有办法通过测试来了解这一点?
注意:我使用的是C#3.0和Visual Studio 2008
答案 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
ushort result = BitConverter.ToUInt16(new byte [2] {Item [5],Item [4]},0);
int result = 256 * Item [5] + Item [4];