Ich möchte ein binäres Protokoll (RFC3588, Durchmesser) mit reinem Haskell implementieren. Ich muss wissen, gibt es irgendeinen besseren Weg (als z.B. Data.Binary ...), um Daten von ByteStrings zu lesen/zu schreiben. Ich mag die Zuordnung eines Haskell-Datensatzes zu ByteString, so wie es in C# mit dem Attribut StructLayout üblich ist (Decorator).Wie kann ich eine binäre Netzwerkpaketstruktur den Haskell-Standarddatentypen (Datensätzen) zuordnen?
Antwort
Haskell gibt Ihnen keine Garantien über Speicherlayout, so dass Sie nicht einfach eine Reihe von Bytes als Struktur werfen können - Sie müssen es mit Binär-oder etwas Ähnliches analysieren (Müsli, Attoparsec, etc).
EDIT: Ein Beispiel für die Verwendung von binären, betrachten:
{-# LANGUAGE DeriveGeneriC#-}
import Data.Binary
import GHC.Generics (Generic)
data Foo = Foo Int | Bar String deriving (Eq, Ord, Show, Read, Generic)
instance Binary Foo
Jetzt können Sie encode
und decode
die Foo
Typ und von Bytes.
Ich meine nicht unter der Haube Layout unbedingt, ich meine, etwas simuliert es, wie in Python: Struct-Paket hilft sehr viel Bytestring (Bytes in Python 3) in eine Standard-Python-Klasse/Tupel zu konvertieren. – Kamyar
@Kamyar Binäre Instanzen bieten genau das, obwohl ich das Problem immer noch nicht verstehe. –
@Kamyar Zum Beispiel, siehe Bearbeiten. –
Haskell gibt Ihnen keine Garantien über Speicherlayout, so dass Sie nicht einfach eine Menge von Bytes als Struktur werfen können - Sie müssen es mit 'binary' oder etwas Ähnlichem (' cereal', 'avro',' Attoparsec' usw.). –
Da [AVP-Header-Layout von den Flags abhängt] (https://tools.ietf.org/html/rfc6733#page-41) kann man das auch nicht mit 'StructLayout' machen. – Cirdec
Sie haben Recht, Cirdec, aber ich möchte die Lösung sowieso für andere Zwecke kennen. – Kamyar