我有一个十六进制字符串,如下所示:
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我认为是罪魁祸首 - 任何人都有任何想法我需要做些什么才能纠正这个问题?
答案 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。