4

嘿,我需要将以下十六进制值存储在一个字节数组中 - 0xCAFEBABEDEADBEEF。

所以我试着像这样存储它。

byte[] v0 = {11001010,11111110,10111010,10111110,11011110,10101101,10111110,11101111};

其中 11001010 是二进制的 CA,11111110 是二进制的 FE,等等。

但是我得到一个错误,说 11001010 是一个 int,所以我认为这是因为字节在 java 中是有符号字节,我们只能有 +127 和 -128 之间的值。

那么有没有办法我可以在java中做到这一点(也许使用无符号字节......如果它们存在!?)谢谢大家。

4

3 回答 3

10

放在0b号码前面。您可能还必须转换为byte

byte[] v0 = {(byte)0b11001010,(byte)0b11111110,...};

前缀表示它0b是二进制数。

如果你想让它更容易阅读,你可以使用0x十六进制:

byte[] v0 = {(byte)0xCA,(byte)0xFE,(byte)0xBA,(byte)0xBE,...};

如果您使用的 Java 版本低于 7,这是一种方法(二进制形式):

byte[] v0 = {Byte.parseByte("11001010", 2),...);
于 2013-02-06T22:32:50.463 回答
5

文字11001010表示int类型和价值的小数11,001,010- 即 11 百万和一些东西。

如果您使用的是Java 7,则可以使用前缀定义二进制文字0b,例如0b11001010. 为了提高可读性,您可以在值中加上下划线,例如0b_1100_1010.

但是,请注意,即使是这种二进制(或十六进制)文字的类型仍然是int. 这一点,再加上字节在 Java 中(不幸地)被签名(因此它们的值在 range 中-128 to 127)导致了一个问题,即值大于的文字127必须手动转换为byte

// 0b_1001_0001 or 0x91 is 145 in decimal
byte b1 = (byte) 0b_1001_0001;
byte b2 = (byte) 0x91;

但是,此类字节的值将是-111(145 - 256)。要取回无符号值,您需要手动将模块 (256) 添加到该值:

int i1 = b1 + 256;
int i2 = b1 & 0xff;
// both i1 and i2 are 145

有关更多信息,请参阅此问题

于 2013-02-06T22:34:32.113 回答
3

如果逐字节写入,您可以使用:

byte[] v0 = {0b11001010, 0b11111110, 0b10111010, ... }

或者

byte[] v0 = {0xCA, 0xFE, ... }
于 2013-02-06T22:33:27.257 回答