1

我有一个看起来像的十六进制字符串:

String hexImage ="0xFFD8FFE000104A46494600010200006400640000FFEC00114475636B79000100040000003C..."

我需要使用 Java 将其转换为图像。我尝试先使用 org.apache.commons.codec.binary.Hex 类转换为字节数组。FileOutputStream 稍后将其转储到文件中。

char[] charArr= hexImage.toCharArray();
byte[] byteArray = Hex.decodeHex(charArr);

但是 Hex 类中的解析器阻塞,解码器异常:奇数个字符。无论我使用什么方法转换为字节数组,它都失败了。文件格式绝对是 JPEG。

我尝试从字符串中删除0xFF,但此时图像已损坏。0xFF 我认为是罪魁祸首 - 有人知道我需要做什么来纠正这个问题吗?

4

2 回答 2

3

通常,每个字节由 2 个十六进制数字表示,因此,如果您的十六进制字符串中有奇数个数字,那么它有问题。您可以尝试在开头使用 0 填充它,例如:

String hexImage ="0xFFD8FFE000104A46494600010200006400640000FFEC00114475636B79000100040000003C...";
if(hexImage.length()%2 == 1)
    hexImage = "0x0" + hexImage.substring(2);

或最后,例如:

String hexImage ="0xFFD8FFE000104A46494600010200006400640000FFEC00114475636B79000100040000003C...";
if(hexImage.length()%2 == 1)
    hexImage += "0";

但是,这不能保证产生正确的图像。

总的来说,您应该检查如何获得十六进制字符串。正确的字节序列应始终包含偶数个十六进制数字。

编辑:此外,正如彼得劳里在他的评论中指出的那样,您应该检查该decode方法是否需要0x在字符串前面。

于 2012-04-13T14:56:53.453 回答
0

对于偶数长度的字符串

 public static byte[] hexStringToByteArray(String str) {
    try {


        String s = str;
        int len = s.length();
        byte[] data = new byte[len / 2];
        for (int i = 0; i < len; i += 2) {
            if (i == len - 1) {
                 System.out.println("in correct");                   
            } else {

                data[i / 2] = (byte) ((Character.digit(s.charAt(i), 16) << 4)
                        + Character.digit(s.charAt(i + 1), 16));


            }
        }
        return data;
    } catch (StringIndexOutOfBoundsException sex) {

        writeDirtyData(str.substring(0, str.indexOf(",")));
    }
    return null;
}

非奇数十六进制字符串是正确的。从你那里检查来源得到这个字符串。这是因为由于字符数限制而截断了字符串。 如果字符串是图像存储在数据库中,则使用程序检索它而不使用任何工具

我在使用 .net 和 MSSQL 时遇到了同样的问题,通过使用 webservice 和 Java 客户端,我尝试了所有转换和库,包括轴和 util jpg。

于 2013-03-19T10:58:21.417 回答