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ビット単位で処理するイメージを作成することができます。それはばかげているかもしれませんが、いくつかのパターンを探しているのであれば、それは非常に気の利いた解決策かもしれません。
異なる値ですか? '-55'と' 201'はほぼ「等しく」見えますか?私はiOSで、それはあなたのスクリーンショットに見られる 'UInt8'を意味し、Javaでは' Int8'と言います。つまり、符号なし対署名(0〜255、-127〜128)を意味します。 – Larme
@Larme – jazzbpn
@ Larmeのお返事ありがとうございます、もう一つ知りたいことがあります。どのようにInt8/UInt8バイト配列を読み込み可能な文字列形式に変換するのですか?ここでこのようにして、私は文字列に変換しようとします。しかし、それは有効なUTF-8シーケンスを出力しません。 if文字列=文字列(データ:データ、エンコーディング:.utf8){print(string)} else {print( "有効なUTF-8シーケンスではありません") – jazzbpn