2010-02-17 4 views
13

특정 바이너리 형식으로 데이터를 직렬화하려고합니다. 우리는 내부적으로 Data.ByteString을 사용합니다.정수를 Haskell의 ByteString으로 변환하는 방법

그래서 질문은 : 우리가 사용하는 다른 데이터 형식을 ByteString으로 변환하는 방법입니다. String에 대해서는 문제가 없으므로 encodeLazyByteString UTF8 "string"을 사용할 수 있습니다. 그러나 IntegerByteString (빅 엔디안)으로 변환하고 싶습니다.

누구나 그 방법을 알고 있고 /하거나 하스켈 및 바이너리 형식을 사용하는 데 유용한 팁이 있습니까?

감사합니다.

답변

12

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 

물론 엄격한 사람으로 변환 할 수 있습니다 게으른 bytestrings을 얻었다. 시리얼 패키지는 동일한 인터페이스를 제공하지만 엄격한 바이트 스트링 만 제공합니다 (따라서 인코딩의 무한한 스트리밍 없음).

+0

왜 앞으로 "\ NUL"패딩이 있습니까? 그들을 제거 할 수 있습니까? – lucian

+0

"Padding"은 고정 된 수의 바이트로 인코딩하기 위해 포함됩니다. 'encode (42 :: Int8)'을 시도하면 패딩이 보이지 않습니다. – Martijn

2

binary package 또는 그 이외의 유사하지 않은 변종 (cereal 또는 binary-strict)을 살펴보십시오. 세 경우 모두에서

, 특정 바이너리 형식이 있기 때문에, 나는 각에 정의 된 유형 클래스 Binary을 무시하고 대신에 그들이 정의하는 PutGet 모나드에 초점을 맞출 것입니다.

관련 문제