将字符串数组转换为字节数组

6
我是一名有用的助手,可以为您进行文本翻译。以下是您需要翻译的内容:

我有一个字符串数组,每个数组元素都是由两个字符组成的十六进制字符串。

例如,该数组可能如下所示:

String a = {"aa","ff","00",.....}

如何在Java中将这个由字符串组成的数组转换为字节数组?

2
我认为你最好的选择是创建一个与字符串数组大小相同的字节数组,使用for循环,在循环内部调用myBytes[i] = Byte.parseByte(myStrings[i], 16)将每个字符串项解析为字节(编辑:糟糕,忘记了基数!)。 - Hovercraft Full Of Eels
@HovercraftFullOfEels - 你应该把那个发表为答案。 - ziesemer
1
@ziesemer:我想是这样。虽然我的声望足够高。 - Hovercraft Full Of Eels
当字符串为“ff”时,它会抛出异常!! - user1077980
2
@user1077980。遍历数组,并使用byte b =(byte)(Integer.parseInt(theHexaString,16)&0xFF)将每个字符串转换为字节; Byte.parseByte()仅解析有符号字节。 - JB Nizet
显示剩余3条评论
4个回答

4
如果您想解析无符号字节十六进制字符串,请使用:
byte[] b = new byte[a.length()];

for (int i=0; i<a.length(); i++) {
    b[i] = (byte) Short.parseShort(a[i], 16);
}

"

根据二进制补码,\"ff\"将被解析为-1。

如果您希望\"ff\"解析为255(超过java字节的范围),则需要使用short类型。

"
short[] b = new short[a.length()];

for (int i=0; i<a.length(); i++) {
    b[i] = Short.parseShort(a[i], 16);
}

是的,这就是我所说的。1+1。 - Hovercraft Full Of Eels
@user1077980:错误是你的,不是Aaron的。你的错误在于尝试解析ff。byte的最大值为7f。尝试解析为int。编辑:或者使用JB Nizet的极好建议! - Hovercraft Full Of Eels
1
@JBNizet: 而且,我甚至认为你的答案不需要 & 0xff 部分,因为强制转换应该会去除高位。 - Hovercraft Full Of Eels
2
对我来说,字节通常不作为有符号数使用,而是作为纯二进制数据的一部分。我认为Java不应该将字节作为有符号数,因为这会使一切变得更加复杂。 - JB Nizet
1
你说的对,需要使用 & 0xFF 如果他想将字节转换为无符号整数。 - JB Nizet
显示剩余5条评论

3
循环遍历数组,并使用该方法将每个字符串转换为字节:
byte b = (byte) (Integer.parseInt(theHexaString, 16)); 

Byte.parseByte()仅解析有符号字节,并且不将符号位视为符号位。


0

你应该查看一下ByteArrayOutputStream

然后,你可以遍历每个字符串,并使用Byte.parseByte()方法。接着,你可以通过使用write方法将其添加到ByteArrayOutputStream中。

一旦你已经转换了所有的字符串,就可以使用ByteArrayOutputStream的toByteArray()方法。


ByteArrayOutputStream会起作用,但在这里有点过度。另外Byte.parseByte()会在输入“ff”时出错。 - Aaron J Lang

0
如果我理解正确,您需要连接后的字符串的字节表示形式?类似于:
public byte[] getBytes(String[] array) {
    StringBuilder builder = new StringBuilder();
    for(String s: array) {
       builder.append(s);
    }
    return builder.toString().getBytes();
}

2
再次强调,不是解析字节。getBytes() 不会将单个字符串解析为它们的字节表示,而是使用每个字符的默认字符集编码 - 这是两件完全不同的事情。您应该删除这个答案。 - Hovercraft Full Of Eels

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接