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

时间:2013-08-25 12:18:49

标签: c#

在Java中,我有以下几行:

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

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

4 个答案:

答案 0 :(得分:8)

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

来自Byte Structure

  

Byte是一个不可变的值类型,表示带有的无符号整数   范围为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};

答案 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来获得感觉。一旦你理解了,它永远不会离开你。