18

これに関する他の質問を見たことがありますが、エラーは文字列の先頭の 0 に関連していました。残念ながら、これは私の場合ではありません。

外部ソースから暗号化されたデータを base64 形式で受信しています。それをデコードし (android SDK のバージョンが 7 であるため、付属の Base64 ライブラリを使用)、メッセージを復号化します。

にキャストしようとすると、LongまたはIntegerこのエラーが発生します。

java.lang.NumberFormatException: Invalid long: "2551122"
    at java.lang.Long.invalidLong(Long.java:125)
    at java.lang.Long.parse(Long.java:362)
    at java.lang.Long.parseLong(Long.java:353)
    at java.lang.Long.parseLong(Long.java:319)
    at com.nzn.lol.LoginActivity$LoginTask.doInBackground(LoginActivity.java:98)
    at com.nzn.lol.LoginActivity$LoginTask.doInBackground(LoginActivity.java:1)
    at android.os.AsyncTask$2.call(AsyncTask.java:264)
    at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:305)
    at java.util.concurrent.FutureTask.run(FutureTask.java:137)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1076)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:569)

入力を確認するために印刷を使用しましたが、実際には文字列「2551122」です。等しいかどうかを確認しようとすると、それも正しくありません

"2551122".equals(numberAsString) // Gives me false

エンコードの問題だと思い、デコードされたバイトを取得していくつかのエンコードで文字列を作成しようとしましたが、これらと同じいくつかのエンコードで base64 文字列からバイトをデコードしようとしましたが、このエラーの原因はまだわかりません。

どんな助けでも大歓迎です

アップデート

これは、文字列を復号化するためのコードです (Encryptor クラス):

private static byte[] decrypt(byte[] raw, byte[] encrypted) throws Exception {
    SecretKeySpec skeySpec = new SecretKeySpec(raw, "AES");
    Cipher cipher = Cipher.getInstance(encryptionAlgorithim);
    cipher.init(Cipher.DECRYPT_MODE, skeySpec, new IvParameterSpec(iVector));
    byte[] decrypted = cipher.doFinal(encrypted);
    return decrypted;
}

public String decrypt(String encryptedString, String key) {

    byte[] keyBytes = key.getBytes();
    byte[] decoded = Base64.decode(encryptedString); // Decodes the string from base64 to byte[]
    byte[] result = decrypt(keyBytes, decoded);
    return new String(result);
}

これがエラーの発生方法です。

Encryptor encryptor = new Encryptor();
Long.parseLong(encryptor.decrypt(base64String, secretKey)) // Throws me the error
4

2 に答える 2

17

クリア テキストには、ASCII 数字のように見えるが ASCII 数字ではない文字が含まれている可能性があります。ASCII 数字以外の数字のリストについては、http://www.fileformat.info/info/unicode/category/Nd/list.htmを参照してください。

それを確認するには、復号化されたテキストとハードコーディングされた long as 文字列に対して次のメソッドを実行し、結果を比較します。

public static String displayCharValues(String s) {
    StringBuilder sb = new StringBuilder();
    for (char c : s.toCharArray()) {
        sb.append((int) c).append(",");
    }
    return sb.toString();
}

編集: クリア テキストは、目に見えない文字である BOM (バイト オーダー マーク) で始まるようです。

于 2012-07-06T16:58:40.463 に答える
0

前後のスペースに注意し、trim() を使用してそれらを処理します。

于 2015-05-13T09:39:02.167 に答える