2016-08-01 56 views
2

我想用純Haskell實現一個二進制協議(RFC3588,Diameter)。我需要知道是否有更好的方法(比如Data.Binary ...)來讀/寫ByteStrings的數據。我喜歡將Haskell記錄映射到ByteString,就像使用StructLayout屬性(裝飾器)的C#中常見的一樣。如何將二進制網絡數據包結構映射到Haskell標準數據類型(記錄)?

+0

Haskell不給你任何關於內存佈局的保證,所以你不能簡單地將一組字節作爲一個結構體 - 你必須用'binary'或類似的東西解析它('cereal','avro','' attoparsec'等)。 –

+1

由於[AVP頭部佈局取決於標誌](https://tools.ietf.org/html/rfc6733#page-41),因此您無法真正使用'StructLayout'來完成。 – Cirdec

+0

你是對的Cirdec,但我想知道解決方案爲其他用途。 – Kamyar

回答

1

Haskell沒有給你任何關於內存佈局的保證,所以你不能簡單地將一組字節作爲一個結構體 - 你必須使用二進制或類似的東西(穀類,attoparsec等)來解析它。

編輯:舉個例子使用二進制的,可以考慮:

{-# LANGUAGE DeriveGeneriC#-} 

import Data.Binary 
import GHC.Generics (Generic) 

data Foo = Foo Int | Bar String deriving (Eq, Ord, Show, Read, Generic) 

instance Binary Foo 

現在,您可以encodedecodeFoo類型和字節。

+0

我並不是一定要在引擎蓋佈局下,我的意思是模擬它的東西,就像在Python中一樣:struct package非常有助於將bytestring(Python 3中的字節)轉換爲標準的Python類/元組。 – Kamyar

+1

@Kamyar儘管二進制實例提供的確如此,但我仍然不明白這個問題。 –

+1

@Kamyar例如,請參閱編輯。 –

相關問題