In keinem Fall sollten Sie versuchen, Daten auf 2-Systemen, wie Sie gerade getan zu vergleichen. Das gilt für alle Typen, aber speziell für Rohdaten.
Rohdaten sind NICHT ohne zusätzlichen Kontext darstellbar, was bedeutet, dass jedes System, das sie präsentiert, wählen kann, wie sie dargestellt werden sollen (Rohdaten können Text in UTF8 oder einem ASCII darstellen, zB JPEG-Bild oder PNG oder Roh-RGB-Pixeldaten) es könnte ein Audio-Sample oder was auch immer sein). In Ihrem Fall zeigt ein System sie als eine Liste von vorzeichenbehafteten 8-Bit-Ganzzahlen an, während der andere 8-Bit-Ganzzahlen ohne Vorzeichen für dieselbe Sache verwendet. Ein anderes System könnte Ihnen zum Beispiel eine Hex-Zeichenkette zeigen, die völlig anders aussehen würde.
Wie @Larme bereits erwähnt, sehen diese genauso aus wie es sicher anzunehmen ist, dass ein System signierte und die anderen vorzeichenlosen Werte verwendet. Um also von signierten (Android) zu unsignierten (iOS) zu konvertieren, müssen Sie negative Werte wie unsigned = 256+signet
also zum Beispiel -55 => 256 + (-55) = 201
konvertieren.
Wenn Sie wirklich Daten in Ihrem Fall vergleichen müssen, ist es am besten, sie in einer Datei als Rohdaten zu speichern. Übertragen Sie dann diese Datei auf ein anderes System und vergleichen Sie die nativen Rohdaten mit denen in der Datei, um zu überprüfen, ob es wirklich einen Unterschied gibt.
EDIT (von Kommentaren):
Printing Rohdaten als String ist ein Problem, aber es gibt ein paar Möglichkeiten. Die Sache ist, dass viele Bytes nicht als Zeichenketten druckbar sind, können Leerzeichen oder einige reservierte Codes sein, aber meistens ist das Problem, dass der Wert von 0 das Ende der Zeichenkette in den meisten Fällen bedeutet, die in der Mitte Ihrer Bytefolge existieren können.
So haben Sie bereits 2 Möglichkeiten Byte für Byte zu drucken, die Int8
oder Uint8
entsprechende Werte anzeigt. Wie in Kommentar beschrieben direkt auf String-Umwandlung möglicherweise nicht so einfach, wie
let string = String(data: data, encoding: .utf8) // Will return nil for strange strings
Eine Möglichkeit, Daten in einem String konvertieren kann jedes Byte in ein entsprechendes Zeichen zu konvertieren sein. Überprüfen Sie diesen Code:
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
Dann ist es zu testen, habe ich:
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)
Das Druckergebnis ist:
!"#$%&'()*+,-./:;<=>[email protected][\]^_`abcdefghijklmnopqrstuvwxyz{|}~ ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþ
Dann ein weiterer beliebter Weg, um einen Hex-String verwendet. Es kann wie folgt angezeigt:
let hexString = data.reduce("", { $0 + String(format: "%02hhx",$1) })
print(hexString)
Und mit den gleichen Daten wie vor dem Ergebnis:
000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9fa0a1a2a3a4a5a6a7a8a9aaabacadaeafb0b1b2b3b4b5b6b7b8b9babbbcbdbebfc0c1c2c3c4c5c6c7c8c9cacbcccdcecfd0d1d2d3d4d5d6d7d8d9dadbdcdddedfe0e1e2e3e4e5e6e7e8e9eaebecedeeeff0f1f2f3f4f5f6f7f8f9fafbfcfdfeff
Ich hoffe, das ist genug, aber im Allgemeinen kann man mit Byte-Array so ziemlich alles tun und Zeig's ihnen. Zum Beispiel könnten Sie ein Bild erstellen, das Bytes als RGB 8-Bit pro Komponente behandelt, wenn es sinnvoll wäre. Es klingt vielleicht albern, aber wenn Sie nach einigen Mustern suchen, könnte es eine ziemlich geistreiche Lösung sein.
Unterschiedliche Werte? '-55' vs' 201' scheint fast "gleich", nein? Ich meine in iOS ist es "UInt8" (es ist in Ihrem Screenshot gesehen), und in Java, ich denke, es ist "Int8", bedeutet unsigned vs signiert (also 0 bis 255 und -127 bis 128). – Larme
Vielen Dank für die Antwort @Larme – jazzbpn
@ Larme, möchte ich noch etwas wissen. Wie konvertiert man Int8/UInt8 Byte-Array in lesbares String-Format? Hier versuche ich auf diese Weise in String zu konvertieren. Aber es druckt keine gültige UTF-8-Sequenz. if let string = String (Daten: Daten, Codierung: .utf8) {print (string)} else {print ("keine gültige UTF-8-Sequenz")} – jazzbpn