Was ist der beste Weg, um einen ByteString in einen Int zu konvertieren?

8

Beim Versuch, einen ByteString zu lesen, lief ich immer den folgenden Fehler auf:
Prelude.read: no parse

Hier ist ein Beispielcode, der dazu führt, dass dieser Fehler beim Rendern in einem Browser auftritt:

%Vor%

Oder vielleicht einfacher:

%Vor%

Aus irgendeinem Grund enthält die resultierende Zeichenfolge nach show bs Anführungszeichen. Um den Fehler zu umgehen, muss ich die Anführungszeichen entfernen und dann read it. Ich verwende die folgende aus dem Internet kopierte Funktion:

%Vor%

Dann funktioniert simple bs = read (sq.show bs) :: Int wie erwartet.

  1. Warum ist das der Fall?
  2. Was ist der beste Weg, um einen ByteString in einen Int zu konvertieren?
qubital 16.01.2012, 23:25
quelle

2 Antworten

9

Show wird verwendet, um eine String -Darstellung von etwas zu erstellen, das für Debugging und Plain-Text-Serialisierung nützlich ist. Die Show typeclass ist nicht nur eine raffinierte Art, etwas in ein String zu konvertieren. Deshalb fügt ByteString der Zeichenfolge Zitate hinzu: weil es beim Debuggen oder Deserialisieren eines Datenstroms einfacher zu lesen ist.

Sie können die Data.ByteString.Char8.unpack verwenden. Funktion zum Konvertieren eines ByteString in ein String , aber beachten Sie, dass dies das ByteString Byte pro Byte entpackt, wodurch hochwertige Unicode-Zeichen oder andere Zeichen, die als mehr als eins gespeichert sind, durcheinander gebracht werden Byte; Wenn Sie etwas anderes tun möchten als read für das Ergebnis zu verwenden, würde ich empfehlen, das ByteString in Text stattdessen, was in dieser Situation mehr Flexibilität bietet. Angenommen, Ihre Kodierung ist UTF8 in diesem Fall (Wie es in Snap standardmäßig der Fall sein sollte), können Sie das Data.Text.Encoding.decodeUtf8 Funktion hierfür. Um dann einen Text -Wert in ein String mit korrekten Unicode-Symbolen zu konvertieren, verwenden Sie Data.Text.unpack .

Sobald du String hast, kannst du read so viel wie du willst; alternativ können Sie einen Text -Wert direkt mit den Funktionen im Data.Text.Read Modul.

    
dflemstr 16.01.2012, 23:36
quelle
10

Welcher der beste Weg, um ByteString in X umzuwandeln, hängt von X ab. Wenn Sie eine gute Conversion von String haben, kann die Verwendung von Data.BytString.Char8.unpack gut sein, wenn es sich um ein ASCII ByteString handelt. Für das UTF-8-codierte ByteString s enthält das Paket utf8-string die Konvertierungsfunktion toString . Für einige spezielle Typen wie Int , wie im Titel erwähnt, gibt es spezielle schnellere Konvertierungen. Zum Beispiel Data.ByteString.Char8.readInt und readInteger .

    
Daniel Fischer 16.01.2012 23:40
quelle

Tags und Links