1

次のような16進文字列があります。

String hexImage ="0xFFD8FFE000104A46494600010200006400640000FFEC00114475636B79000100040000003C..."

Javaを使用して画像に変換する必要があります。最初に org.apache.commons.codec.binary.Hex クラスでバイト配列に変換してみました。FileOutputStream は後でこれをファイルにダンプします。

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

ただし、Hex クラスのパーサーは、Decoder の例外でチョークします: 奇数の文字。バイト配列への変換にどの方法を使用しても、失敗します。ファイル形式はもちろんJPEGです。

この0xFF を文字列から削除しようとしましたが、この時点で画像が破損しています。0xFF が犯人だと思います-これを修正するために何をする必要があるかについてのアイデアはありますか?

4

2 に答える 2

3

通常、各バイトは 2 桁の 16 進数で表されるため、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";

ただし、これは適切な画像を生成することを保証するものではありません。

全体として、16 進文字列を取得する方法を確認する必要があります。適切なバイト シーケンスには、常に偶数の 16 進数が含まれている必要があります。

編集:さらに、Peter Lawrey がコメントで示したように、メソッドが文字列の前にあることを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;
}

奇数の16進文字列以外は正しいです。この文字列を取得したソースを確認してください。文字数制限による文字列の切り捨てによるものです。 文字列がデータベースに保存されている画像の場合は、ツールを使用せずにプログラムを使用して取得します

.netとMSSQLでも同じ問題が発生し、WebサービスとJavaクライアントを使用して、axisとutiljpgを含むすべての変換とライブラリを試しました。

于 2013-03-19T10:58:21.417 に答える