将2个字节转换为数字

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)

  • @Macho Matt:如果您想对已被接受的答案发表评论,最好发表评论而不是编辑问题本身。此外,您的观点并不严格准确 - 计算机系统是大端还是小端都没有关系,只有最初创建字节数组的系统与运行 .NET 的系统具有不同的端序才重要代码在这里。 (2认同)

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中它是相反的.

  • 另外值得注意的是:`(高<< 8)| low` (9认同)

Mar*_*ell 7

你说"这个值显然是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位.