2013-02-06 106 views
4

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

所以,我试图将其保存像这样。

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

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

但我得到一个错误说11001010是一个int,所以我想这是因为字节签署了在Java字节,我们只能有+127和-128之间的值。

那么,有没有办法,我可以在java中做到这一点(可能使用无符号字节......如果存在的话!?) 谢谢你们。

+1

这取决于你使用的是什么版本的Java。对于1.7,您可以用“0b”前缀每个二进制值,否则您将不得不使用十六进制并在每个十六进制值前添加“0x”。 –

回答

9

在号码前加上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),...); 
+1

@ user1974753 JLS中的一个小警告。 '0x'和'0b'文字全部被解释,然后符号扩展为'int'值。对Doorknob添加的'byte'进行强制转换只会从符号扩展的'int'中取最后8位,所以这应该可以正常工作。 – Brian

3

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

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

byte[] v0 = {0xCA, 0xFE, ... } 
+1

但是byte [] v0 = {0xCA};给我以下错误:类型不匹配:不能从int转换为字节????? – user1974753

5

字面11001010表示int类型和值11,001,010的小数 - 也就是11个milions和东西。

如果您正在使用Java 7的,您可以定义使用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 

欲了解更多信息,请参阅this question

+0

但是byte [] v0 = {0xCA};给我以下错误:类型不匹配:不能从int转换为字节????? – user1974753

+0

@ user1974753用类似'(byte)0xCA'的字节进行类型转换。 – Smit

+0

但是,11001010 = 202是十进制的,十六进制的CA,所以我们可以在java中保存一个字节的最大值是+127,那么有什么方法可以在一个字节中存储11001010(十进制202)吗? – user1974753