繁体   English   中英

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

[英]Getting error in convert a string of a hex to a byte array in Java

我正在寻找一种将代表十六进制值的字符串转换为字节数组的方法。 此代码非常适合偶数字符串长度,但不适用于奇数字符串长度。 如果字符串长度为奇数,则得到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 < len继续循环,这使我成为循环中字符串的最后一个索引,从而导致s.charAt(i+1)访问不存在的字节。

将循环条件更改为i < len-1i+1 < len

奇数情况下的数据大小变小。

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

7/2 = 3(取整数值)

在循环的后面,您尝试访问的数据为0到3(大小为4)。

另外,您正在访问s.charAt(i + 1)中的元素,因为循环从0到7开始,因此索引更大。i的值更改为:

0 2 4 6

当它是6时,s.charAt(7)将抛出StringIndexOutOfBoundsException。 字符串的长度为7(索引0到6)。 字符串中没有第七个索引。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM