在Java中,我有以下几行:
new byte[]{59, 55, 79, 1, 0, 64, -32, -3};
但是,在C#中,我不能在字节数组中使用负字节。我尝试将其转换为字节,但失败了。我能做什么?谢谢!
答案 0 :(得分:8)
因为在C#中字节是无符号。在Java中,字节是签名的。
Byte是一个不可变的值类型,表示带有的无符号整数 范围为0的值(由Byte.MinValue表示 常量)到255(由Byte.MaxValue常量表示)
字节数据类型是8位带符号的二进制补码整数。它有 最小值为-128,最大值为127
我该怎么办?
您可以在C#中使用sbyte
,它代表8位有符号整数。
SByte值类型表示值范围为的整数 负128至正127.
像;
sbyte sb = new sbyte[] {59, 55, 79, 1, 0, 64, -32, -3};
答案 1 :(得分:6)
为了接近byte
的Java概念,请使用sbyte
:
var data = new sbyte[] { 59, 55, 79, 1, 0, 64, -32, -3 };
然后您可能还需要将其他变量更改为sbyte
。
答案 2 :(得分:4)
在Java中,字节是有符号的,而在C#中,字节是无符号的。您可以通过在数字中添加256来将有符号转换为无符号,这样(在您的示例中)-32变为224而-3变为253.
正如Ichabod Clay所说(在评论中),您也可以使用sbyte
类型,这样您就不必进行转换。我个人不喜欢有符号的字节,所以如果这是文字数据,我只需要转换一次并完成,但你可以选择。好极了。 :-D
答案 3 :(得分:1)
通常,您可以简单地将签名转换为无符号,然后再返回。大多数时候,您仍然对字节的位值感兴趣。它们在两个系统中保持不变(因为已经定义了双补码有符号数)。现在,如果您向上转换为使用更多位的值,并且希望转换为无符号正数,则只需使用按位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. }
对于这种转换,您可能希望了解如何在您喜欢的编辑器中使用正则表达式查找/替换。
最后,它需要一些玩转换和按位AND来获得感觉。一旦你理解了,它永远不会离开你。