【问题标题】:Hex String to Image十六进制字符串到图像
【发布时间】:2012-04-13 14:52:33
【问题描述】:

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

String hexImage ="0xFFD8FFE000104A46494600010200006400640000FFEC00114475636B79000100040000003C..."

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

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

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

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

【问题讨论】:

  • 你试过删除什么THIS
  • 也许是因为错误消息提示的字符数是奇数。你检查过这个吗? Hex 方法是否希望您以 0x 开头?
  • @PeterLawrey 关于字符串是否应该以0x 开头的好点,但是这些是 2 个字符,因此 OP 仍然对初始字符串有问题。
  • 对于 JPEG/JIFF,从 FFD8 开始是可以的。这是“图像开始”的代码

标签: java string image io


【解决方案1】:

通常,每个字节由 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";

但这并不能保证生成正确的图像。

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

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

【讨论】:

  • 字符串直接来自 SQL 服务器,但它表示图像数据类型 (BLOB) - 我可能应该在我的程序中重新检查!你的第二段让我仔细检查。错过了这不仅仅是一串字符..当您直接从表中复制时,它的外观。
【解决方案2】:

对于偶数长度的字符串

 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。

【讨论】:

    猜你喜欢
    • 2011-03-01
    • 2010-10-04
    • 2014-10-29
    • 2014-03-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-26
    • 1970-01-01
    相关资源
    最近更新 更多