5

在Java中,我有以下行:

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

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

4

4 回答 4

9

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

Byte Structure

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

Primitive Data Types

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

我能做些什么?

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

SByte 值类型表示整数,取值范围从负 128 到正 127。

喜欢;

sbyte[] sb = new sbyte[] {59, 55, 79, 1, 0, 64, -32, -3};
于 2013-08-25T12:20:51.533 回答
7

为了接近 java 的 a 理念byte,请使用sbyte

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

然后您可能还必须更改其他变量sbyte

于 2013-08-25T12:25:44.913 回答
4

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

正如 Ichabod Clay 所说(在评论中),您也可以使用该sbyte类型,这样您就不必进行这种转换。我个人不喜欢有符号字节,所以如果这是用于文字数据,我只需转换一次即可完成,但您可以选择。耶。:-D

于 2013-08-25T12:19:53.447 回答
2

通常,您可以简单地将已签名的内容转换为未签名的内容,然后再返回。无论如何,大多数时候您都对字节的位值感兴趣。这些在两个系统中都保持不变(因为已经定义了双补码有符号数的方式)。现在,如果您向上转换为使用更多位的值,并且您想转换为无符号正数,只需使用按位 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 来获得感觉。一旦你明白,它永远不会离开你。

于 2013-08-25T12:40:29.723 回答