2010-02-17 12 views
13

Chcemy serializować dane w określonym formacie binarnym. Używamy wewnętrznie Data.ByteString s.Jak przekonwertować Integer na ByteString w Haskell

Pytanie brzmi: jak przekonwertować różne typy danych, których używamy, na ByteString. Dla String nie mamy problemu, możemy użyć encodeLazyByteString UTF8 "string". Ale chcielibyśmy również przekonwertować Integer s na ByteString s (big-endian).

Czy ktoś wie, jak to zrobić i/lub ma jakieś dobre wskazówki, używając formatów Haskell i binarnych?

Dzięki!

Odpowiedz

12

Doskonałym pracy dla Data.Binary:

Prelude> :m + Data.Binary 
Prelude Data.Binary> encode (pi :: Double) 
Chunk "\SOH\SOH\NUL\NUL\NUL\NUL\NUL\NUL\NUL\a\CAN-DT\251!\EM\255\255\255\255\255\255\255\205" Empty 

Prelude Data.Binary> encode (42 :: Integer) 
Chunk "\NUL\NUL\NUL\NUL*" Empty 

otrzymując leniwe bytestrings, które mogą oczywiście być przekształcone w te ściśle. Pakiet zbożowy zapewnia bardzo podobny interfejs, ale zapewnia jedynie ścisłe testowanie (więc nie ma nieskończonego przesyłania strumieniowego kodowań).

+0

Dlaczego przed tobą jest "\ NUL"? Czy można je usunąć? – lucian

+0

"Padding" jest dołączony, aby zakodować go do określonej liczby bajtów. Spróbuj 'encode (42 :: Int8)', a na przykład nie zobaczysz paddingu. – Martijn

2

Spójrz na binary package lub dowolny z jego niezbyt leniwych wariantów: cereal lub binary-strict.

We wszystkich trzech przypadkach, ponieważ masz konkretnego formatu binarnego, będę ignorować klasę typu Binary zdefiniowany w każdym, i zamiast skupić się na PutGet monad i oni definiują.

Powiązane problemy