在Java中,我有以下行:
new byte[]{59, 55, 79, 1, 0, 64, -32, -3};
然而,在C#中,我不能在字节数组中使用负字节。我尝试将其转换为字节,但失败了。我能做什么?谢谢
因为在C#中,字节是无符号的。在Java中,字节被签名。
来自Byte Structure
Byte是一种不可变的值类型,表示带范围从0(由Byte.MinValue表示常数)到255(由Byte.MaxValue常数表示)
来自Primitive Data Types
字节数据类型是一个8位有符号2的补码整数。它有最小值-128,最大值127
我能做什么
您可以在C#中使用sbyte
,它表示8位有符号整数。
SByte值类型表示值范围从负128到正127。
喜欢;
sbyte[] sb = new sbyte[] {59, 55, 79, 1, 0, 64, -32, -3};
为了接近byte
的java思想,请使用sbyte
:
var data = new sbyte[] { 59, 55, 79, 1, 0, 64, -32, -3 };
然后您可能还需要将其他变量更改为sbyte
。
在Java中,字节是有符号的,而在C#中,字节则是无符号的。您可以通过在数字上加256将数字从有符号转换为无符号,这样(在您的示例中)-32变为224,-3变为253。
正如Ichabod Clay(在评论中)所说,您也可以使用sbyte
类型,这样您就不必进行转换。就我个人而言,我不喜欢有符号的字节,所以如果这是文字数据,我只需要转换一次就可以了,但你可以选择。是的:-D
通常,您可以简单地将signed转换为unsigned,然后再转换回来。大多数时候,您都对字节的比特值感兴趣。这在两个系统中保持不变(因为定义两个补符号的方式)。现在,如果您向上转换到一个使用更多位的值,并且您想转换为无符号正数,只需使用逐位and,使用1位作为所需的位数。
在C#中,您可以使用
int negInt = (sbyte) b;
byte anotherB = (byte) negInt;
在Java中使用:
int posInt = b & 0xFF;
byte anotherB = (byte) posInt;
当您需要将字节值作为数字时,可以使用这样的功能。否则,您可以将位存储在字节数组中——有符号或无符号。
这个方法也应该适用于整个字节数组的规范——就像您在C#示例中使用的那样:
new byte[] {59, 55, 79, 1, 0, 64, (byte)-32, (byte)-3};
甚至
new byte[] {(byte)59, (byte)55, (byte)79, (byte)1, (byte)0, (byte)64, (byte)-32, (byte)-3};
如果您使用C#,则可能需要添加unchecked()
。
Java也是如此:
new byte[] { (byte) 255, etc. }
对于这种转换,您可能需要学习如何在您喜欢的编辑器中使用正则表达式find/replace。
最终,它需要一点选角和逐位and来获得感觉。一旦你明白了,它永远不会离开你。