Java 将十六进制字符串转换为字节数组

Java 将十六进制字符串转换为字节数组,java,arrays,string,hex,Java,Arrays,String,Hex,我编写了一个程序,将十六进制字符串转换成字节数组,例如“2e65”生成[2,14,6,5] 有没有一种方法可以减少代码行数或不使用ASCII表值 public static byte[] stringToData( String dataString) { byte [] hexStringToByteArr = new byte[dataString.length()]; for ( int i = 0; i < dataString.length(); i++) {

我编写了一个程序,将十六进制字符串转换成字节数组,例如
“2e65”
生成
[2,14,6,5]

有没有一种方法可以减少代码行数或不使用ASCII表值

public static byte[] stringToData( String dataString) {
    byte [] hexStringToByteArr = new byte[dataString.length()];
    for ( int i = 0; i < dataString.length(); i++) {
        char c = dataString.charAt(i);
        if ( c == 48 ) { hexStringToByteArr[i] = 0;}
        if ( c == 49 ) { hexStringToByteArr[i] = 1;}
        if ( c == 50 ) { hexStringToByteArr[i] = 2;}
        if ( c == 51 ) { hexStringToByteArr[i] = 3;}
        if ( c == 52 ) { hexStringToByteArr[i] = 4;}
        if ( c == 53 ) { hexStringToByteArr[i] = 5;}
        if ( c == 54 ) { hexStringToByteArr[i] = 6;}
        if ( c == 55 ) { hexStringToByteArr[i] = 7;}
        if ( c == 56 ) { hexStringToByteArr[i] = 8;}
        if ( c == 57 ) { hexStringToByteArr[i] = 9;}
        if ( c == 97 ) { hexStringToByteArr[i] = 10;}
        if ( c == 98 ) { hexStringToByteArr[i] = 11;}
        if ( c == 99 ) { hexStringToByteArr[i] = 12;}
        if ( c == 100 ) {hexStringToByteArr[i] = 13;}
        if ( c == 101 ) {hexStringToByteArr[i] = 14;}
        if ( c == 102 ) {hexStringToByteArr[i] = 15;}
    }
    return hexStringToByteArr;
}

public static void main(String [] args) {
    String pracString = "2e65";    
    System.out.println(Arrays.toString(stringToData(pracString)));
}
公共静态字节[]stringToData(字符串数据字符串){
byte[]hexStringToByteArr=新字节[dataString.length()];
对于(int i=0;i
要将十六进制字符串转换为字节数组,首先需要获取给定字符串的长度,并在创建新字节数组时将其包含在内

string str = "2e65";
byte[] val = new byte[str.length() / 2];
for (int i = 0; i < val.length; i++) {
   int index = i * 2;
   int j = Integer.parseInt(str.substring(index, index + 2), 16);
   val[i] = (byte) j;
}
现在,执行for循环,直到字节数组的长度

string str = "2e65";
byte[] val = new byte[str.length() / 2];
for (int i = 0; i < val.length; i++) {
   int index = i * 2;
   int j = Integer.parseInt(str.substring(index, index + 2), 16);
   val[i] = (byte) j;
}
为此:

byte[] hexStringToByteArr = new byte[dataString.length() / 2];
十六进制中的“2e65”
表示两个字节(
2e
,对应于十进制中的
46
,和
65
,对应于十进制中的
101
)。要获取包含两个字节的
字节[]
,可以利用
biginger

String hex = "2e65";
byte[] b = new BigInteger(hex, 16).toByteArray();
System.out.println(Arrays.toString(b));
上述代码段的输出为:

[46, 101]
[2, 14, 6, 5]

相反,如果您希望将四个十六进制数字中的每一个转换为
字节
,并将其存储在
字节[]
中,则可以在迭代
字符串
中的每个
字符时使用:

String hex = "2e65";
byte[] b = new byte[hex.length()];

for (int i = 0; i < b.length; i++) {
    b[i] = (byte) Character.digit(hex.charAt(i), 16);
}

System.out.println(Arrays.toString(b));

您的大区块o’IF可以替换为:

hexStringToByteArr[i] = c < 58 ? c - 48 : c - 87;
hexstringtobytarr[i]=c<58?c-48:c-87;

2e65
应该是两个字节,而不是四个。您可以使用
hexstringtobytarr[i]=Character.digit(c,16)而不是所有的if语句。@ElliottFrisch你能告诉我为什么我需要两个而不是四个吗?我做了除以2所说的,但这会导致我的程序出错。此外,从逻辑上我也不明白,如果我的字符串有4个值,我不需要字节数组中相同数量的索引来容纳它们吗?一个字节是2个十六进制数字,如果是一个数字,它将被限制为16个值(因此是十六进制)。如果我没有正确编写问题。我的代码按预期与输出一起工作。我需要每个十六进制字符都以十进制形式显示在字节数组中为什么字节数组必须是长度的一半?既然我有4个值,我不需要4个索引的字节数组吗?如果我包括byte[]hexstringtobytarr=newbyte[dataString.length()/2];我得到一个数组的出界error@wetmoney由于代码试图访问超过字符串长度一半的字节数组索引,因此会出现
ArrayIndexOutOfBounds
错误。改用我的代码(这样就包含了
for
循环),它就会工作。第二个输出就是我所要求的。谢谢你提供这两个。