【问题标题】:Caused by: java.lang.StringIndexOutOfBoundsException: length=7; index=7 Android java引起:java.lang.StringIndexOutOfBoundsException: length=7;索引=7 Android java
【发布时间】:2015-07-10 06:51:46
【问题描述】:

嗨,我使用函数将十六进制字符串转换为字节数组,它有时会给我这个错误,有时它会工作,有时它会出错

原因:java.lang.StringIndexOutOfBoundsException: length=7;index=7 > at java.lang.String.indexAndLength(String.java:500) 在 java.lang.String.charAt(String.java:494)

public static byte[] hexStringToByteArray(String s) {
        int len = s.length();
        byte[] 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;
    }

此代码中出现错误,并且 为什么它大部分时间都在工作,只是有时它会使应用程序关闭,任何人都可以解决这个问题,以便它可以一直工作

我使用上面的这个函数将 crc32 校验和到 bytearray

这是我用来获取 crc32 校验和的函数

private String chesum() {

        String fileName = "file.bin";

        try {

            CheckedInputStream cis = null;

            try {
                // Compute CRC32 checksum
                cis = new CheckedInputStream(
                        new FileInputStream(fileName), new CRC32());

            } catch (FileNotFoundException e) {
                System.err.println("File not found.");

            }

            byte[] buf = new byte[128];
            while(cis.read(buf) >= 0) {
            }

            long checksum = cis.getChecksum().getValue();

            String ss = Long.toHexString(checksum);

            cis.close();
            return ss;

        } catch (IOException e) {
            e.printStackTrace();

        }
        return null;


    }

在这个方法之后我调用了 hexstringtobytearray 函数

【问题讨论】:

  • 我认为当长度为奇数时它会引发错误,因此请检查条件。

标签: java android


【解决方案1】:
for(int i = 0; i < len-1 ; i+=2){
            data[i/2] = (byte) ((Character.digit(s.charAt(i), 16) << 4) + Character.digit(s.charAt(i+1), 16));
         }

将条件len改为len -1

【讨论】:

  • 这实际上使它起作用,但是十六进制字符串到字节数组不是没有-1的答案,因为它是完美的,但它会强制关闭
  • 那是因为你的输入不正确。您正在尝试通过一次获取两个字符并将它们转换为一个字节来转换字符串。如果一次输入两个字符,则输入应包含偶数个字符。但是,您输入的长度是奇数(7,在您给出的示例异常中)。如果输入字符串长度为奇数,您应该怎么做?丢弃最后一个字符?用空字节填充字符串?您应该在 for 循环中或循环之后处理它。
  • @Buurman 是的,这就是问题所在,即使你可以尝试修改它并在代码中发布答案,因为你知道我是 android 初学者,我犯了错误并学习非常感谢:)
  • @androidstarter: 奇数长度的字符串怎么办?如果我们不知道,我们无法为您提供帮助。 ;-)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-12-21
  • 1970-01-01
  • 2018-12-11
  • 1970-01-01
  • 1970-01-01
  • 2019-03-11
相关资源
最近更新 更多