如何在Java中将十六进制字符串转换为字节值

22

我有一个字符串数组。 我想将它转换为字节数组。 我使用Java程序。 例如:

String str[] = {"aa", "55"};

转换为:

byte new[] = {(byte)0xaa, (byte)0x55};

我能做些什么?


1
请参见以下链接:https://dev59.com/GXVC5IYBdhLWcg3w7V_3 - rafraf
2
byte n[] = str.getBytes() 就可以完成任务。但是,由于 new 是一个关键字,不能用作标识符,因此您会收到错误提示。 - backslashN
@backslashN:结果不会是{97, 97}{53, 53}吗? - U. Windl
10个回答

54
String str = "Your string";

byte[] array = str.getBytes();

3
除非默认的平台依赖字符集足够(在大多数情况下是不可取的),否则始终要指定特定的字符集,例如 UTF-8,使用该方法的重载版本之一,如 String#getBytes(Charset charset)String#getBytes(String charsetName) - Tiny
byte[]数组 = str.getBytes("UTF-8"); 抛出UnsupportedEncodingException异常 - daddygames

15

从示例中可以看出,您的意思是字符串数组实际上是字节的十六进制表示的数组,对吗?

如果是这样,那么针对每个字符串项,我会执行以下操作:

  1. 检查字符串是否仅由2个字符组成
  2. 这些字符在'0'..'9'或'a'..'f'区间内(考虑大小写)
  3. 将每个字符转换为相应的数字,减去 '0' 或 'a' 的代码值
  4. 构建一个字节值,其中第一个字符是高位,第二个字符是低位。例如:

    int byteVal = (firstCharNumber << 4) | secondCharNumber;
    

11

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

byte[] theByteArray = stringToConvert.getBytes();

将字符串转换为字节:

 String str = "aa";

 byte b = Byte.valueOf(str);

3
当我输入从AF的值时,它会给我一个NumberFormatException - Muhammed Refaat

9
您可以尝试类似以下内容的代码:

您可以尝试类似以下内容的代码:

String s = "65";

byte value = Byte.valueOf(s);

使用Byte.ValueOf()方法将String数组中的所有元素转换为Byte值。


7
无法正常运行。java.lang.NumberFormatException:无法将“aa”解析为整数。 - brian
这意味着它是一个空字符串。 - Mithun Sasidharan

3
还有很长的路要走 :). 我不知道如何摆脱冗长的for语句。
ArrayList<Byte> bList = new ArrayList<Byte>();
for(String ss : str) {
    byte[] bArr = ss.getBytes();
    for(Byte b : bArr) {
        bList.add(b);
    }
}
//if you still need an array
byte[] bArr = new byte[bList.size()];
for(int i=0; i<bList.size(); i++) {
    bArr[i] = bList.get(i);
}

3

由于没有关于将十六进制字符串转换为单个字节的答案,这里是我的:

private static byte hexStringToByte(String data) {
    return (byte) ((Character.digit(data.charAt(0), 16) << 4)
                  | Character.digit(data.charAt(1), 16));
}

使用示例:

hexStringToByte("aa"); // 170
hexStringToByte("ff"); // 255
hexStringToByte("10"); // 16

或者你也可以尝试使用 Integer.parseInt(String number, int radix) 方法,我认为它比其他方法要好得多。

// first parameter is a number represented in string
// second is the radix or the base number system to be use
Integer.parseInt("de", 16); // 222
Integer.parseInt("ad", 16); // 173
Integer.parseInt("c9", 16); // 201

这是对我来说最好的方法。 - nani

2
String source = "testString";
byte[] byteArray = source.getBytes(encoding); 

您可以使用foreach循环并对数组中的所有字符串执行相同操作。


我的意思是将(字符串)“aa”更改为(字节)0xaa,而不是(字节)0x97,(字节)0x97。 - brian

0
最简单的方式(使用Apache Common Codec):
byte[] bytes = Hex.decodeHex(str.toCharArray());

0

如果要将字符串转换为byte[],可以使用以下实用代码:

    String[] str = result.replaceAll("\\[", "").replaceAll("\\]","").split(", ");
    byte[] dataCopy = new byte[str.length] ;
    int i=0;
    for(String s:str ) {
        dataCopy[i]=Byte.valueOf(s);
        i++;
    }
    return dataCopy;

0
String str[] = {"aa", "55"};

byte b[] = new byte[str.length];

for (int i = 0; i < str.length; i++) {
    b[i] = (byte) Integer.parseInt(str[i], 16);
}

Integer.parseInt(string, radix) 将一个字符串转换为整数,radix 参数指定数字系统。

如果字符串表示十六进制数,请使用基数 16。
如果字符串表示二进制数,请使用基数 2。
如果字符串表示十进制数,请使用基数 10(或省略基数参数)。

有关详细信息,请查看 Java 文档:https://docs.oracle.com/javase/7/docs/api/java/lang/Integer.html#parseInt(java.lang.String,%20int)


1
仅有代码的答案无法解释代码为何有效:请为未来的访问者添加解释,说明您是如何解决问题的。 - Alex Huszagh

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