如何从bytestring中获取Int:
let val_hex = Data.ByteString.Char8.pack "\xcd"
let val_dig = Data.ByteString.Char8.pack "\205"
val_hex == val_dig -- True
let maybeInt = Data.ByteString.Char8.readInt val_hex -- gets Nothing
所以,我想要恢复该值,打包到bytestring。即maybeInt应该是Maybe(205,“”)
答案 0 :(得分:2)
readInt
函数用于从(通常为多字节)字节字符串中读取编码为ASCII字符串的整数,如下所示:
> let b = Data.ByteString.Char8.pack "12345"
> b
"12345"
> Data.ByteString.Char8.readInt b
Just (12345,"")
>
看起来您想从单字节字节字符串中提取整数,其中整数只是字节的值。最直接的方法可能是使用Data.ByteString.head
:
> let b = Data.ByteString.Char8.pack "\xcd"
> Data.ByteString.head b
205
> :t Data.ByteString.head b
Data.ByteString.head b :: GHC.Word.Word8
>
请注意,这是来自head
的{{1}},其返回Data.ByteString
,而非Word8
返回Data.ByteString.Char8.head
。作为一般规则,Char
中的函数将字节字符串视为ASCII编码,而Data.ByteString.Char8
中的函数只将其视为一组字节,其值为0-255。大多数将字节串操作为ASCII的程序都需要使用两个模块中的函数。
由于Data.ByteString
返回Data.ByteString.head
,您可能需要使用Word8
将其转换为您想要的整数类型:
fromIntegral