2017-12-18 18 views
0

アンドロイドのすべてが完璧に動作しています。私はiOSでも同じ機能を実装したいが、異なる値を得たい。以下の画像で説明を確認してください。で enter image description here文字列を素早くBase64のバイト配列に変換し、javaは異なる値を返します

:私はjavaの

byte[] data1 = Base64.decode(balance, Base64.DEFAULT); 

のような出力にbase64で文字列をバイト配列に変換しようとした

:Javaの/ Androidのケースで

Swift3/iOSケース: は、私のような迅速にbase64で文字列をバイト配列に変換しようとした

let data:Data = Data(base64Encoded: balance, options: NSData.Base64DecodingOptions(rawValue: 0))! 
let data1:Array = (data.bytes) 

出力:最後に解決 enter image description here

+0

異なる値ですか? '-55'と' 201'はほぼ「等しく」見えますか?私はiOSで、それはあなたのスクリーンショットに見られる 'UInt8'を意味し、Javaでは' Int8'と言います。つまり、符号なし対署名(0〜255、-127〜128)を意味します。 – Larme

+0

@Larme – jazzbpn

+0

@ Larmeのお返事ありがとうございます、もう一つ知りたいことがあります。どのようにInt8/UInt8バイト配列を読み込み可能な文字列形式に変換するのですか?ここでこのようにして、私は文字列に変換しようとします。しかし、それは有効なUTF-8シーケンスを出力しません。 if文字列=文字列(データ:データ、エンコーディング:.utf8){print(string)} else {print( "有効なUTF-8シーケンスではありません") – jazzbpn

答えて

0

これは、署名によるものです符号なし整数は符号なしと符号付きを意味します(0〜255、-127〜128)。ここではにUInt8配列をInt8配列に変換する必要があるため、問題は解決されます。

let intArray = data1.map { Int8(bitPattern: $0) } 
0

2台のシステムのデータを比較してみてください。これはすべてのタイプに適用されますが、特に生のデータに適用されます。

生データは、追加のコンテキストなしで表示することはできません。プレゼンテーションを行うシステムでは、どのように表示するかを選択できます(未加工データはUTF8またはASCIIのテキストを表す場合があります。それはオーディオサンプルなどである可能性があります)。あなたのケースでは、1つのシステムでは符号付き8ビット整数のリストとして表示され、もう1つは同じものに対して8ビット符号なし整数を使用します。例えば、別のシステムでは、まったく違って見える16進文字列を表示することがあります。

@Larmeはすでに同じように見えますが、あるシステムでは符号付きの値と符号なしの値が使用されていると考えても過言ではありません。したがって、署名付き(Android)から署名なし(iOS)に変換するには、unsigned = 256+signetのように負の値を変換する必要があります(例:-55 => 256 + (-55) = 201)。

ケース内のデータを実際に比較する必要がある場合は、生データとしてファイルに保存することをお勧めします。次に、そのファイルを別のシステムに転送し、ネイティブの生データとファイル内のデータを比較して、実際に違いがあるかどうかを確認します。 (コメントから)

EDIT:文字列として

印刷生データは問題ですが、いくつかの方法があります。問題は、多くのバイトが文字列として印刷可能ではなく、空白または一部の予約コードである可能性がありますが、ほとんどの場合、値0はバイトシーケンスの途中に存在するほとんどの場合の文字列の最後を意味します。

あなたはすでにInt8またはUint8相当の値を表示しているバイト単位で印刷する2つの方法があります。コメントに記載されているように

let string = String(data: data, encoding: .utf8) // Will return nil for strange strings 

ように簡単に動作しない可能性があり、文字列に直接変換文字列にデータを変換する一つの方法は、対応する文字に、各バイトを変換することができます。このコードをチェック:それをテストするためにその後

let characterSequence = data.map { UnicodeScalar($0) } // Create an array of characters from bytes 
let stringArray = characterSequence.map { String($0) } // Create an array of strings from array of characters 
let myString = stringArray.reduce("", { $0 + $1 }) // Convert an array of strings to a single string 

let myString2 = data.reduce("", { $0 + String(UnicodeScalar($1)) }) // Same thing in a single line 

を私が使用:

let data = Data(bytes: Array(0...255)) // Generates with byte values of 0, 1, 2... up to 255 
let myString2 = data.reduce("", { $0 + String(UnicodeScalar($1)) }) 
print(myString2) 

印刷結果は次のとおりです。

!"#$%&'()*+,-./:;<=>[email protected][\]^_`abcdefghijklmnopqrstuvwxyz{|}~ ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþ 

次に、別の一般的な方法は、16進文字列を使用しています。結果は前のよう

let hexString = data.reduce("", { $0 + String(format: "%02hhx",$1) }) 
print(hexString) 

同じデータを持つ:それはのように表示することができ

000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9fa0a1a2a3a4a5a6a7a8a9aaabacadaeafb0b1b2b3b4b5b6b7b8b9babbbcbdbebfc0c1c2c3c4c5c6c7c8c9cacbcccdcecfd0d1d2d3d4d5d6d7d8d9dadbdcdddedfe0e1e2e3e4e5e6e7e8e9eaebecedeeeff0f1f2f3f4f5f6f7f8f9fafbfcfdfeff 

私は、これは十分にあると思いますが、一般的に、あなたがバイトの配列とほとんど何でもできるし、見せる。たとえば、コンポーネントをRGBの8ビット単位で処理するイメージを作成することができます。それはばかげているかもしれませんが、いくつかのパターンを探しているのであれば、それは非常に気の利いた解決策かもしれません。

+0

Maticは本当に答えに感謝しています。どのようにInt8/UInt8バイト配列を読み込み可能な文字列形式に変換するのですか?ここでこのようにして、私は文字列に変換しようとします。しかし、それは有効なUTF-8シーケンスを出力しません。 あれば聞かせて文字列=文字列(データ:データ、エンコーディング:.UTF8){ プリント(文字列) }他{ プリント( "無効UTF-8シーケンス") } – jazzbpn

+0

@jazzbpn私の編集をチェックして、させてくださいこれが説明されているかどうかは分かっています –

関連する問題