Hex String to Image

我有一个hex字符串,看起来像:

String hexImage ="0xFFD8FFE000104A46494600010200006400640000FFEC00114475636B79000100040000003C..." 

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

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

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

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

通常,每个字节由2个hex数字表示,因此,如果您的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"; 

但是,这不能保证产生合适的图像。

总的来说,你应该检查你的hex字符串。 正确的字节序列应始终包含偶数个hex数字。

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

对于均匀长度的弦

  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; } 

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

我和.net和MSSQL有同样的问题,通过使用webservice和Java Client,我尝试了所有的转换和库,包括axis和util jpg。