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



在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来获得感觉。一旦你明白了,它永远不会离开你。

最新更新