Java代码 – 字节数组中的负字节到C#

在Java中,我有以下几行:

new byte[]{59, 55, 79, 1, 0, 64, -32, -3}; 

但是,在C#中,我不能在字节数组中使用负字节。 我尝试将其转换为字节,但失败了。 我能做什么? 谢谢!

因为在C#中字节是无符号的 。 在Java中,字节是有符号的

Byte Structure

字节是一个不可变的值类型,表示无符号整数,其值范围从0(由Byte.MinValue常量表示)到255(由Byte.MaxValue常量表示)

Primitive Data Types

字节数据类型是8位带符号的二进制补码整数。 它的最小值为-128,最大值为127

我能做什么?

您可以在C#中使用sbyte ,它代表8位有符号整数。

SByte值类型表示值为负128到正127的整数。

喜欢;

 sbyte sb = new sbyte[] {59, 55, 79, 1, 0, 64, -32, -3}; 

为了保持接近java的一个byte想法,使用sbyte

 var data = new sbyte[] { 59, 55, 79, 1, 0, 64, -32, -3 }; 

然后你可能还必须将其他变量更改为sbyte

在Java中,字节是有符号的,而在C#中,字节是无符号的。 您可以通过向数字添加256来将signed从signed转换为unsigned,以便(在您的示例中)-32变为224而-3变为253。

正如Ichabod Clay所说(在评论中),您也可以使用sbyte类型,这样您就不必进行转换。 我个人不喜欢有符号的字节,所以如果这是文字数据,我只需要转换一次并完成,但你可以选择。 好极了。 😀

通常,您可以简单地将签名转换为无符号,然后再返回。 大多数时候,您仍然对字节的位值感兴趣。 它们在两个系统中都保持不变(因为已经定义了双补码有符号数)。 现在,如果您向上转换为使用更多位的值,并且希望转换为无符号正数,则只需使用按位AND,使用1位作为所需的位数。

在C#中你可以使用

 int negInt = (sbyte) b; byte anotherB = (byte) negInt; 

在Java中使用:

 int posInt = b & 0xFF; byte anotherB = (byte) posInt; 

当您需要字节值作为数字时,可以使用此类function。 否则,您只需将这些位存储在字节数组中 – 有符号或无符号。

此方法也适用于整个字节数组的规范 – 正如您在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来获得感觉。 一旦你明白,它永远不会离开你。