2012-01-02 13 views
1

デスクトップ・サーバーにライセンス・キーが生成され、アンドロイド・デバイスで検証コードが実行されるAndroidアプリケーション用のライセンス・マネージャーを作成中に、デスクトップで実行された認証コードは望ましい結果をもたらしますが、同じコードはAndroidで異なる結果を生成します。Oracle JREとDalvik JVMの結果が異なります

私は問題をデバッグし、結果がスナップされていたところに達しました!結果は出てくるのOracle JDKの

byte[] bytes = {-88, 50, -29, 114, 51, 88, 38, -52, 114, 91, -23, -55, 124, 37, -90, -49, 36, -110, -67, -59, -33, -75, 85, -72, -109, 25, -54, 89, 6, 35, -50, -11, -87, -22, 33, -2, 55, -30, 75, -36, -40, -29, -103, 110, 46, -100, -68, 101, -105, 62, 53, -20, -20, -21, -118, -72, -27, 32, 59, 127, 15, -117, 6, 102}; 
System.out.println(new String(bytes, "UTF-8").hashCode()); 

-24892055 

ことが、Android携帯電話上の結果はする:

-186036018 
ここ

は違いを実証するコードスニペットです

ご協力いただければ幸いです。

+0

Googleのライセンス確認ライブラリを使用しないのはなぜですか? (http://developer.android.com/guide/publishing/licensing.html) – JesusFreke

答えて

3

getBytes()を呼び出すと、そこにもエコーコードを指定する必要があります。そうしないと、OSからのデフォルトのエンコーディングが取得されます。 showBytes(new String(bytes, "UTF-8").getBytes("UTF-8"));

+0

今私はとても愚かな気がしています:P ありがとう、私の一日を保存しました.... –

+1

私は別の問題に遭遇しました: バイト[]バイト= {-88,50,29,114,51,88,38,52,114,91、-23、-55,124,37、-90、-49,36、-110 -67、-59、-33、-75,85、-72、-109、25、-54,49,6,35、-50、-11、-87、-22、33、-2,55 -30、-75、-36、-40、-29、-103、110、46、-100、-68、101、-105,62,53、-20、-20、-21、-118、 72、-27、32、59、127、15、-117、6、102}; のSystem.out.println(新しい文字列(バイト、 "UTF-8")のhashCode());デスクトップ上の ' 出力:Android上で' -24892055' : '-186036018' 間違っていることができますかこれで? –

+2

元の質問を完全に変更するのではなく、新しい質問を開始する必要があります。 – superfell

2

AndroidとJavaが不正な形式のUTF-8を処理する方法の違いです。 4バイトのシーケンス0xf5 0xa9 0xea 0x21が与えられると、Androidは2つのUnicode置換文字(0xfffd)を返します。 Oracleのクラス・ライブラリは、3つのUnicode置換文字を戻します。

ここでは、問題を示す簡単な例を示します。

​​

OracleのJVMは、あなたの最善の策は、あなたは彼らが実際にあることを知っている場合を除き、UTF-8を使用してデコードバイトシーケンスを避けるためです

fffd fffd fffd 

Androidのdalvikvmプリント

fffd fffd 

を印刷しUTF- 8。この不一致をDalvikの調査チームに報告しました:Android bug 23831

CharsetDecoderを使用する場合、Androidはicu4cを使用して変換を行います。それはU + fffd U + fffd U + 0021を返します。これは私のUTF-8仕様の読み方でも正しいようです。将来のリリースでは、AndroidのStringはAndroidのCharsetDecoder 2と一致します。

+0

ありがとうございます。それは素晴らしい! –

関連する問題