嘿,我需要在字节数组中存储以下十六进制值-0xCAFEBABEDEADBEEF。
所以我试着这样储存。
byte[] v0 = {11001010,11111110,10111010,10111110,11011110,10101101,10111110,11101111};
其中11001010是二进制中的CA,11111110是二进制等中的FE。
但我得到一个错误,说11001010是int,所以我认为这是因为字节在java中是有符号的字节,我们只能有+127到-128之间的值。
那么,我有没有办法在java中做到这一点(也许使用无符号字节……如果它们存在的话!?)谢谢大家。
将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),...);
文字11001010
表示int
类型和值11,001,010
的小数,即1100万左右。
如果使用Java7,则可以使用0b
前缀定义二进制文字,例如0b11001010
。为了提高可读性,可以在值中添加下划线,例如0b_1100_1010
。
然而,请注意,即使是这样的二进制(或十六进制)文字的类型仍然是int
。这一点,再加上字节在Java中(不幸地)被签名(因此它们的值在-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
有关更多信息,请参阅此问题
如果逐字节写入,可以使用:
byte[] v0 = {0b11001010, 0b11111110, 0b10111010, ... }
或
byte[] v0 = {0xCA, 0xFE, ... }