Hex String to Image

时间:2012-04-13 14:52:34

标签: java string image io

我有一个十六进制字符串,如下所示:

String hexImage ="0xFFD8FFE000104A46494600010200006400640000FFEC00114475636B79000100040000003C..."

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

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

然而,Hex类中的解析器会出现扼流圈,并带有Decoder异常:奇数个字符。无论我使用什么方法转换为字节数组,都会失败。 fileformat绝对是JPEG。

我尝试从字符串中删除 this 0xFF,但此时图像已损坏。 0xFF我认为是罪魁祸首 - 任何人都有任何想法我需要做些什么才能纠正这个问题?

2 个答案:

答案 0 :(得分:3)

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

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

或最后,例如:

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

然而,无法保证产生合适的图像。

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

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

答案 1 :(得分: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;
}

非奇数十六进制字符串是正确的。检查您的来源获取此字符串。这是因为字符串的限制没有字符串的截断。 如果String是图像存储在数据库中,则使用不使用任何工具的程序检索它

我在使用.net和MSSQL以及使用webservice和Java Client时遇到了同样的问题 我尝试了所有的转换和库,包括axis和util jpg。