2011-06-28 147 views
3
字节数组

可能重复:
Convert a string representation of a hex dump to a byte array using Java?爪哇 - 从字符串

例如,我有一个字符串 “DEADBEEF”。如何将它转换为byte [] bytes = {0xDE,0xAD,0xBE,0xEF}?

+0

Google是你的朋友 –

+2

请参阅[使用Java将十六进制转储的字符串表示形式转换为字节数组](http://stackoverflow.com/questions/140131/convert-a-string-representation-of-a -hex-dump-to-a-byte-array-using-java) – wjans

+3

为什么人们不使用API​​? :[ – mre

回答

6

环路和单独转换每一对:

byte[] bytes = new byte[str.length()/2]; 

for(int i = 0; i < str.length(); i+=2) 
    bytes[i/2] = ((byte)Character.digit(str.charAt(i),16))<<4)+(byte)Character.digit(str.charAt(i),16); 

我没有测试此代码了(我没有跟我一个编译器自动取款机),但我希望通过上心。减法/加法只是将'A'转换为数字10,'B'转换为11等。位移4将第一个十六进制数字移动到正确的位置。

编辑:重新思考一下后,我不确定你是否问正确的问题。您是否想将“DE”转换为{0xDE},或者转换为{0x44,0x45}?后者更有用,前者更像是一个功课问题类型的问题。

+1

+ 1Yeah - 有人问这个问题! – Nick

+0

为什么后者更有用?第一种是标准的十六进制编码。我很难找到适合你的“更好”解释的问题。 – musiKk

+0

@musiKk:后者被称为“ASCII编码”,而不是“十六进制解码”。 –

3

getBytes()会得到平台编码中字符的字节。然而,它听起来像你想要将包含字节的十六进制表示的字符串转换为实际表示的字节数组。

在这种情况下,我想指出,你对这个存在的问题:Convert a string representation of a hex dump to a byte array using Java?(注:我个人比较喜欢第二个答案使用commons-编解码器,但更多的是出于哲学的原因)通过每对两个字符

2

您可以解析字符串转换为长,然后提取字节:

String s = "DEADBEEF"; 
long n = Long.decode("0x" + s); //note the use of auto(un)boxing here, for Java 1.4 or below, use Long.decode("0x" + s).longValue(); 
byte[] b = new byte[4]; 
b[0] = (byte)(n >> 24); 
b[1] = (byte)(n >> 16); 
b[2] = (byte)(n >> 8); 
b[3] = (byte)n; 
+0

这种情况适用于这种情况,但一般只适用于长达16个十六进制数字(即8个解码字节)的字符串。 –

+0

@Paulo确实如此,但如果需要的话,您可以将字符串拆分为16个字符的批次。 – Thomas

1

tskuzzy的回答可能是正确的(没有测试),但如果可以的话,我推荐使用Commons Codec Apache的。它有一个Hex类,可以满足你的需求。