在Java中,我有以下行:
new byte[]{59, 55, 79, 1, 0, 64, -32, -3};
但是,在 C# 中,我不能在字节数组中使用负字节。我尝试将其转换为字节,但失败了。我能做些什么?谢谢!
在Java中,我有以下行:
new byte[]{59, 55, 79, 1, 0, 64, -32, -3};
但是,在 C# 中,我不能在字节数组中使用负字节。我尝试将其转换为字节,但失败了。我能做些什么?谢谢!
因为在 C# 中字节是无符号的。在 Java 中,字节是有符号的。
Byte 是一种不可变值类型,它表示无符号整数,其值范围从 0(由 Byte.MinValue 常量表示)到 255(由 Byte.MaxValue 常量表示)
字节数据类型是一个 8 位有符号二进制补码整数。它的最小值为 -128,最大值为 127
我能做些什么?
您可以sbyte
在 C# 中使用它表示 8 位有符号整数。
SByte 值类型表示整数,取值范围从负 128 到正 127。
喜欢;
sbyte[] sb = new sbyte[] {59, 55, 79, 1, 0, 64, -32, -3};
为了接近 java 的 a 理念byte
,请使用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
通常,您可以简单地将已签名的内容转换为未签名的内容,然后再返回。无论如何,大多数时候您都对字节的位值感兴趣。这些在两个系统中都保持不变(因为已经定义了双补码有符号数的方式)。现在,如果您向上转换为使用更多位的值,并且您想转换为无符号正数,只需使用按位 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 来获得感觉。一旦你明白,它永远不会离开你。