Ratlosigkeit macht sich breit , [Uint8] -> String

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • Ratlosigkeit macht sich breit , [Uint8] -> String

    Hallo,
    ich scheitere gerade am umwandeln eines binären streams in einen String. Ich bekomme immer wieder ein Packet mit 20 bytes an Informationen. Aber "Array(UnsafeBufferPointer(start: UnsafePointer<UInt8>(data.bytes), count: data.length))" erfüllt nicht seinen zweck bzw. irgendwann kommt einfach misst raus. Wäre nett wenn mir dabei jemand helfen könnte

    Console :

    Quellcode

    1. <01420013 ff020642 55453244 32343220 31312d33>
    2. request pending
    3. <302d3039 0393>
    4. Version
    5. Optional("B\u{13}\u{02}BED4 11-30-09")
    6. [66, 19, 2, 66, 69, 68, 52, 32, 49, 49, 45, 51, 48, 45, 48, 57]

    Quellcode

    Quellcode

    1. func nrfReceivedData(nrfManager: NRFManager, data: NSData?, string: String?) {
    2. guard let data = data else{
    3. Request()
    4. print("empty file")
    5. return
    6. }
    7. print(data)
    8. // NSData to Array of UInt8
    9. let binArray = Array(UnsafeBufferPointer(start: UnsafePointer<UInt8>(data.bytes), count: data.length))
    10. binstream += binArray
    11. if !handle.StreamCheckRoutine(binstream) {
    12. print("request pending")
    13. return
    14. }
    15. switch handle.Response(binstream) {
    16. case .Runtime:
    17. print("Runtime")
    18. communicationtimer.invalidate()
    19. LogData.sharedInstance.addSensorData(binArray)
    20. case .Acknowledge:
    21. print("Acknowledge")
    22. communicationtimer.invalidate()
    23. break
    24. case .Version:
    25. print("Version")
    26. let str = String(bytes: handle.deleteFrame(binstream), encoding: NSUTF8StringEncoding)
    27. id.text = str
    28. print(str)
    29. print(handle.deleteFrame(binstream))
    30. communicationtimer.invalidate()
    31. binstream = []
    32. break
    33. case .Sucesss:
    34. print("Sucesss")
    35. communicationtimer.invalidate()
    36. binstream = []
    37. break
    38. ......
    Alles anzeigen
    Gruß
  • du kannst nur einen gültigen string erstellen wenn du grad eine gültige position im stream hast. da bei utf8 eben zeichen mit 1 oder mehreren bytes encodet sind kannst führt es zu einem problem wenn du bei einem solchen multibyte zeichen mitten drin bist und daraus einen string erstellen willst.

    den quellcode hab ich mir nicht angeschaut. tut ja wohl auch nichts zur sache oder?
  • Du kannst schauen, ob du mit -rangeOfComposedCharacterSequenceAtIndex: bzw. -rangeOfComposedCharacterSequenceForRange: versuchen, den gültigen Bereich zu ermitteln. Allerdings vergrößern die eigentlich den gültigen Bereich, was bei dir hinter dem Ende des (Teil-)Strings läge. Ich mutmaße aber mal, dass wenn du auf das letzte Zeichen gehst und das unvollständig ist, du irgendwas zurückbekommst, was sich als Fehler interpretieren lässt.
    Es hat noch nie etwas gefunzt. To tear down the Wall would be a Werror!
    25.06.2016: [Swift] gehört zu meinen *Favorite Tags* auf SO. In welcher Bedeutung von "favorite"?
  • Man kann natürlich auch jedes byte durchgehen das leftmost bit ansehen, wenn das 1 ist, dann schaut man wie viel bate für das multibyte zeichen benötigt werden. falls soviel zeichen noch vorhanden sind, dann diese überspringen und mit der abfrage weitermachen ansonsten nur bis hier - 1 verwenden.
  • macmoonshine schrieb:

    Das ist aber kein UTF-8-Dekodierungsproblem, weil da keine Bytes größer als 127 sind. Der String entsprecht genau dem, was im Array steht.

    Wenn das eine druckbare Zeichenkette sein soll, sind die Bytes 19 und 2 allerdings schon etwas ungewöhnlich.
    haha, hab gar nicht gesehen dass er auch die daten die er bekommt gepostet hat. hab mich nur auf seine beschreibung verlassen.
  • Das ist nicht ganz so simpel, weil das letzte Byte innerhalb einer 3- oder 4-Byte Sequenz liegen könnte. Man muss zuerst das letzte Byte finden, für das byte & 0xC0 gilt. Dann kann man aber sehr leicht testen, ob es vollständig ist.
    Es hat noch nie etwas gefunzt. To tear down the Wall would be a Werror!
    25.06.2016: [Swift] gehört zu meinen *Favorite Tags* auf SO. In welcher Bedeutung von "favorite"?
  • Amin Negm-Awad schrieb:

    Das ist nicht ganz so simpel, weil das letzte Byte innerhalb einer 3- oder 4-Byte Sequenz liegen könnte. Man muss zuerst das letzte Byte finden, für das byte & 0xC0 gilt. Dann kann man aber sehr leicht testen, ob es vollständig ist.
    um es zu vereinfachen wär ich einfach vom ersten zeichen gestartet. man kann aber natürlich auch hinten anfangen was sicherlich optimaler ist.
  • Hallo erst mal danke für die Antworten , ich hab wohl ein Gespür für außergewöhnliches...
    Ich verstehe aber gerade leider nicht viel was ihr mir sagen wollt , ich lege doch die länge eines jeden teil streams mit "....r<UInt8>(data.bytes)" fest.
    Sprich jedes Array element hat genau 8bit (UInt8)!

    Gruß