Vac*_*ano 10 c# binary byte bytearray 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
Mus*_*sis 21
BitConverter 可以轻松地将两个字节转换为两个字节的整数值:
// assumes byte[] Item = someObject.GetBytes():
short num = BitConverter.ToInt16(Item, 4); // makes a short
// out of Item[4] and Item[5]
Run Code Online (Sandbox Code Playgroud)
unw*_*ind 11
两个字节的数字有一个低字节和一个高字节.高字节值低于低字节的256倍:
value = 256 * high + low;
Run Code Online (Sandbox Code Playgroud)
因此,对于高= 0和低= 7,该值为7.但是对于高= 7和低= 0,该值变为1792.
这当然假设该数字是一个简单的16位整数.如果有什么比这更好的话,以上就不够了.然后,您需要有关如何编码数字的更多知识,以便对其进行解码.
高字节和低字节出现的顺序由字节流的字节顺序决定.在big-endian中,你会看到前低(在较低的地址),在little-endian中它是相反的.
你说"这个值显然是7",但它完全取决于编码.如果我们假设全宽字节,那么在little-endian中,是的; 7,0是7.但是在big endian中它不是.
对于小端,你想要的是什么
int i = byte[i] | (byte[i+1] << 8);
Run Code Online (Sandbox Code Playgroud)
对于big-endian:
int i = (byte[i] << 8) | byte[i+1];
Run Code Online (Sandbox Code Playgroud)
但其他编码方案可用; 例如,一些方案使用7位算术,第8位作为连续位.一些方案(UTF-8)将所有连续位放在第一个字节中(因此第一个只有有限的数据位空间),而序列中其余的则为8位.