我想用純Haskell實現一個二進制協議(RFC3588,Diameter)。我需要知道是否有更好的方法(比如Data.Binary ...)來讀/寫ByteStrings的數據。我喜歡將Haskell記錄映射到ByteString,就像使用StructLayout屬性(裝飾器)的C#中常見的一樣。如何將二進制網絡數據包結構映射到Haskell標準數據類型(記錄)?
回答
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
現在,您可以encode
和decode
的Foo
類型和字節。
我並不是一定要在引擎蓋佈局下,我的意思是模擬它的東西,就像在Python中一樣:struct package非常有助於將bytestring(Python 3中的字節)轉換爲標準的Python類/元組。 – Kamyar
@Kamyar儘管二進制實例提供的確如此,但我仍然不明白這個問題。 –
@Kamyar例如,請參閱編輯。 –
- 1. 如何將oracle數據類型映射到java數據類型?
- 2. 用Haskell存儲大型結構化二進制數據
- 3. 如何使用linq將數據映射到類結構?
- 4. 如何將樹數據結構保存到Haskell中的二進制文件
- 5. 如何將Slick結果映射到不同的數據結構?
- 6. 如何將數據類型映射到自定義類型?
- 7. 映射數據結構混淆映射
- 8. 將數據構造函數映射到類型
- 9. 將數據庫結構映射到nHibernate映射文件
- 10. 二進制數據的標準SQL類型是什麼?
- 11. 將流數據映射到C#中的數據結構
- 12. 與數據結構網絡堆等效功率和映射
- 13. 將spark數據幀數據類型映射到jdbc數據類型
- 14. 在網絡數據包中標記應用程序類型
- 15. 將非類型化的Lisp數據映射到編譯函數中使用的類型二進制格式
- 16. 如何將類層次結構(基類和繼承類)映射到數據庫
- 17. 將函數映射到新類型定義爲數據結構列表
- 18. 確定網絡數據包結構
- 19. EntityFramework數據庫優先 - 類型映射 - 將二進制(8)從SQL映射到C#中的int
- 20. 如何將這個數據庫結構映射到NHibernate中?
- 21. 將通用數據結構映射到特定數據結構的模式
- 22. 從標準輸入二進制數據中找到IP v4數據包
- 23. 標準ML二叉樹數據類型
- 24. ProJNA數據類型映射
- 25. 什麼SQlite數據類型映射到clr數據類型double?
- 26. Sqlite數據類型映射到.net(CLR)框架數據類型
- 27. 如何映射對象數據類型
- 28. 如何將二進制映像轉換爲python中的內存數據結構?
- 29. 如何使用JPA(Java EE)將XML數據結構映射到數據庫
- 30. 如何將字符串屬性映射到數據庫中的二進制列?
Haskell不給你任何關於內存佈局的保證,所以你不能簡單地將一組字節作爲一個結構體 - 你必須用'binary'或類似的東西解析它('cereal','avro','' attoparsec'等)。 –
由於[AVP頭部佈局取決於標誌](https://tools.ietf.org/html/rfc6733#page-41),因此您無法真正使用'StructLayout'來完成。 – Cirdec
你是對的Cirdec,但我想知道解決方案爲其他用途。 – Kamyar