在Java中将十六进制字符串转换为字节数组时出错

在Java中将十六进制字符串转换为字节数组时出错,java,Java,我正在寻找一种将表示十六进制值的字符串转换为字节数组的方法。此代码适用于偶数字符串长度,但不适用于奇数字符串长度。如果字符串长度为奇数,则得到java.lang.StringIndexOutOfBoundsException。请帮忙 public byte[] hexStringToByteArray(String s) { byte[] data = null; if(! s.equals("")){ int len = s.leng

我正在寻找一种将表示十六进制值的字符串转换为字节数组的方法。此代码适用于偶数字符串长度,但不适用于奇数字符串长度。如果字符串长度为奇数,则得到java.lang.StringIndexOutOfBoundsException。请帮忙

public byte[] hexStringToByteArray(String s) {
     byte[] data = null;
         if(! s.equals("")){    
            int len = s.length();
            data = new byte[len / 2];
            for (int i = 0; i < len; i += 2) {
                data[i / 2] = (byte) ((Character.digit(s.charAt(i), 16) << 4)
                                     + Character.digit(s.charAt(i+1), 16));
            }
         }
     return data;
}

for循环表示在i
将循环条件更改为i数据,以防奇数变小

假设字符串长度为7,则数据数组的大小为3

7/2=3取整数值

在循环的后面部分,您将尝试访问大小为4的0到3的数据

此外,您正在访问s.charAti+1中的元素,当循环从0到7开始时,该元素会产生更大的索引。i的值变化如下:

0 2. 4. 六,

当它为6时,s.charAt7将抛出StringIndexOutOfBoundsException。由于字符串的长度为7,索引为0到6。字符串的第7个索引不存在

解决方案是通过更改循环条件来减少循环运行的次数。

StringgetBytes有什么问题?