1

だから私は小さな復号化プログラムを書こうとしていますが、少し問題が発生しています。「FF」(すべてのビットを反転) を使用して文字に XOR を適用しています。これは、文字列をバイト配列に変換してから XOR を適用することによって実行しています。しかし、文字は Shift-JIS エンコーディングで、何かが機能していません。通常の文字でこの方法を試してみるとうまくいくようですが、日本語の文字になると何かがうまくいきません。

public void sampleMethod(String a)
    {
       try {
        String b = "FF";
        byte[] c = a.getBytes("Shift_JIS");
        byte[] d = b.getBytes("Shift_JIS");
        byte[] e = new byte[50];
        for (int i=0; i<c.length; i++)
        {
            e[i] =(byte)(c[i]^d[i%2]);
        }
        String t = new String(e, "Shift_JIS");
        System.out.println(t);
    }
       catch (UnsupportedEncodingException e)
       {
        }

    }

しかし、日本語の文字に固執すると、すべての文字が「yyyyyy」に変換されます。問題を確認するためにバイト配列を出力してみましたが、各文字が「63」として格納されていることがわかりました。文字を正しく保存するにはどうすればよいですか? 実際、Shift-JIS 文字で XOR を使用するにはどうすればよいでしょうか。

基本的にビットを 0010 から 1101 に反転してから文字に戻したいので、XOR を使用しています。それは可能ですか?

ありがとう

たとえば、これは私の入力でした: '始めまして" そして、出力されるのは: "yyyyy" そして、"こんにちは" のようなことをすると、".#**)f2.#4#" が得られます。

4

1 に答える 1

3

マルチバイト文字に対してこの種のバイト単位の操作を行うことはできません。

通常、日本語の文字 (およびその他の拡張文字) は、一連のバイトで表されます。これらを変更すると、適切にデコードできない無効なシーケンスが生成される可能性があります (これがあなたが見ている結果だと思います)。

ウィキペディアの記事から、シフト JIS

最初のバイトが上位ビット セット (0x80–0xFF) であることのみを保証します。2 番目のバイトの値は、上位または下位のいずれかです。

XORすることで、この保証を破っていると思います。

ビットを逆にしてもう一度元に戻したい場合は、byte[]内部でデータ型を操作し、シフト JIS 構造化バイト配列であることが確実な場合にのみ文字列に戻します。

于 2011-05-22T22:55:05.163 に答える