2011-12-02 12 views
1

私はCipher Block Chainingを学校で使っていますが、Stringと返される別のStringというメソッドが必要です。最初は、私はそれが奇妙だと思って、byte[]の変数がはるかに適切だろうが、まだ方法を実装しました。基本的にコードは次のとおりです。Javaバイト[]から文字列とUTF-8

static public String encode(String message) { 
    byte[] dataMessage = message.getBytes(); 
    ByteArrayOutputStream out = new ByteArrayOutputStream(); 

    byte last = (byte) (Math.random() * 256); 
    byte cur; 
    out.write(last); 

    for (byte b : data) { 
     cur = (byte) (b^last); 
     System.out.println("Encode '" + (char) b + "' = " + b + "^" + last + " > " + cur); 
     out.write(cur); 
     last = cur; 
    } 

    System.out.println("**ENCODED BYTES = " + Arrays.toString(out.toByteArray())); 
    System.out.println("**ENCODED STR = " + Arrays.toString(out.toString().getBytes())); 

    return out.toString(); 
} 

decodeの方法も同様です。いくつかの回では、この方法は

Encode 'H' = 72^109 > 37 
Encode 'e' = 101^37 > 64 
Encode 'l' = 108^64 > 44 
Encode 'l' = 108^44 > 64 
Encode 'o' = 111^64 > 47 
**ENCODED BYTES = [109, 37, 64, 44, 64, 47] 
**ENCODED STR = [109, 37, 64, 44, 64, 47] 

ような結果を吐くだろう。しかし、時にはまた、私は、これはUTF-8(システムのデフォルトのエンコーディング)とは何かを持っていることを前提とし

Encode 'H' = 72^-63 > -119 
Encode 'e' = 101^-119 > -20 
Encode 'l' = 108^-20 > -128 
Encode 'l' = 108^-128 > -20 
Encode 'o' = 111^-20 > -125 
**ENCODED BYTES = [-63, -119, -20, -128, -20, -125] 
**ENCODED STR = [-17, -65, -67, -17, -65, -67, -17, -65, -67, -17, -65, -67] 

のようなものを吐くだろうが、私は、という正確にを特定するのに十分に精通していないので、そのような文字列が指定されたバイトとともに返されるのはなぜですか。

答えて

3

バイトの任意のシーケンスを取得して、それが有効なUTF-8エンコードされた文字列であるとみなすことはできません。したがって、toStringメソッドは、documented,のように、不正な入力文字列およびマップ不可能文字列を、プラットフォームのデフォルト文字セットのデフォルト置換文字列で置き換えると思われます。

このように、純粋にバイナリデータを文字列に変換するべきではありません。バイトを印刷可能な文字列に変換するには、HexまたはBase64のようなエンコーディングを使用します。逆もまた同様です。

Apache commons-codecにはBase64ユーティリティクラスがあります。

+0

はい、すべての文字シーケンス(UTF-8には、次のマルチバイト文字の先頭に表示されるようにスキップする自己同期プロパティがあります)は、U + FFFD置換文字で置き換えられますUTF8で:0xef 0xbf 0xbd)。 – ninjalj

+0

はい、これが私の考えです(置換文字について)。そして私はBase64の実装を使用します。 –

0

この:

out.toString().getBytes() 

は、あなたが期待する何をしていません。暗号化されたバイトを取り、そのバイトをUTF-8でエンコードされた文字列であるかのように解釈します。次に、その文字列の文字をバイトに変換します。

任意のバイト(この場合は暗号化されたデータ)を取り出して、それをUTF-8エンコードされたテキストのように扱うことはできません。

関連する問題