我正在实现一个协议,该协议规定表示密码的字符串应序列化为固定长度的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个原始字节?
我假设"额外的块"你的意思是第一位"\NUL\NUL\NUL\NUL\NUL\NUL\NUL\n.这是一个64位长度的字段(注意它的值是10),它是Serialize定义的一部分ByteString.由于你在调用之后已经有了一个bytestring TE.encodeUtf8,我建议你只使用putByteString避免长度字段(或者putLazyByteString如果你要导入一个惰性文本编码模块).