使用Data.Cereal或Data.Binary序列化String

Eri*_*ric 5 haskell

我正在实现一个协议,该协议规定表示密码的字符串应序列化为固定长度的10字节字段.我正在使用Data.Cereal来执行此任务.这是我最近的一次:

padText :: Int -> Text -> Text
padText fieldLen = T.justifyLeft fieldLen '\NUL'

putPassword :: Putter Password
putPassword = put . TE.encodeUtf8 . padText 10
Run Code Online (Sandbox Code Playgroud)

在ByteStrings上加上一个额外的8字节块,在它编码的前面加上:

 runPut $ putPassword "Friend"
Run Code Online (Sandbox Code Playgroud)

造成 :

"\NUL\NUL\NUL\NUL\NUL\NUL\NUL\nFriend\NUL\NUL\NUL\NUL"
Run Code Online (Sandbox Code Playgroud)

我不想要额外的块.为什么这样表现?

有谁知道如何序列化只有10个原始字节?

Tho*_*son 7

我假设"额外的块"你的意思是第一位"\NUL\NUL\NUL\NUL\NUL\NUL\NUL\n.这是一个64位长度的字段(注意它的值是10),它是Serialize定义的一部分ByteString.由于你在调用之后已经有了一个bytestring TE.encodeUtf8,我建议你只使用putByteString避免长度字段(或者putLazyByteString如果你要导入一个惰性文本编码模块).