2017-12-18 6 views
0

In Fall von Android funktioniert alles perfekt. Ich möchte dasselbe Feature auch in iOS implementieren, aber unterschiedliche Werte erhalten. Bitte überprüfen Sie die Beschreibung mit Bildern unten.Konvertieren Zeichenfolge in Base64 Byte-Array in Swift und Java geben anderen Wert

In Java/Android Fall:

Ich habe versucht, die Zeichenfolge Base64 Byte-Array in java wie

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

Output zu konvertieren: enter image description here

In Swift3/iOS Fall:

Ich habe versucht, die Zeichenfolge Base64 Byte-Array in schnellen wie

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

Output zu konvertieren: enter image description here

+0

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

+0

Vielen Dank für die Antwort @Larme – jazzbpn

+0

@ 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

Antwort

0

Schließlich gelöst:

Dies ist aufgrund unterzeichnet und unsigned integer, bedeutet unsigned vs signed (also 0 bis 255 und -127 bis 128). Hier, müssen wir das UInt8-Array in Int8-Array konvertieren und damit wird das Problem gelöst.

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

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.

+0

Matic vielen Dank für die Antwort, ich möchte 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. wenn lassen string = String (Daten: Daten, Kodierung: .utf8) { print (string) } else { print ("keine gültige UTF-8-Sequenz") } – jazzbpn

+0

@jazzbpn meine bearbeiten Bitte überprüfen und lassen Ich weiß, ob das erklärt ist. –

Verwandte Themen