2016-08-01 40 views
2

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?

+0

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.). –

+1

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

+0

Sie haben Recht, Cirdec, aber ich möchte die Lösung sowieso für andere Zwecke kennen. – Kamyar

Antwort

1

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.

+0

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

+1

@Kamyar Binäre Instanzen bieten genau das, obwohl ich das Problem immer noch nicht verstehe. –

+1

@Kamyar Zum Beispiel, siehe Bearbeiten. –