gpt4 book ai didi

haskell - Haskell 中 ByteString 和 ByteString.Lazy 的常用函数

转载 作者:行者123 更新时间:2023-12-04 12:08:33 27 4
gpt4 key购买 nike

我实现了读取 ByteString 并将其转换为十六进制格式的函数。
例如。给定“AA10”,它将其转换为 [170, 16]

import qualified Data.ByteString.Lazy as BSL
import qualified Data.ByteString.Internal as BS (w2c)

rHex :: BSL.ByteString -> BSL.ByteString
rHex bs
| BSL.null bs = BSL.empty
| BSL.null rest' = fromHex c1 `BSL.cons` BSL.empty
| otherwise = rChunk c1 c2 `BSL.cons` rHex rest
where (c1, rest') = (BSL.head bs, BSL.tail bs)
(c2, rest) = (BSL.head rest', BSL.tail rest')
rChunk c1 c2 = (fromHex c1) * 16 + fromHex c2
fromHex = fromIntegral . digitToInt . BS.w2c

但是我意识到我需要相同的功能,但对于简单的 ByteString,而不是 Lazy。
我来到的唯一方法是这样的:
import qualified Data.ByteString.Lazy as BSL
import qualified Data.ByteString as BS
import qualified Data.ByteString.Internal as BS (w2c)

rHex' funcs@(null, empty, cons, head, tail, fromHex) bs
| null bs = empty
| null rest' = fromHex c1 `cons` empty
| otherwise = rChunk c1 c2 `cons` rHex' funcs rest
where (c1, rest') = (head bs, tail bs)
(c2, rest) = (head rest', tail rest')
rChunk c1 c2 = (fromHex c1) * 16 + fromHex c2

fromHex = fromIntegral . digitToInt . BS.w2c

rHexBSL :: BSL.ByteString -> BSL.ByteString
rHexBSL = rHex' (BSL.null, BSL.empty, BSL.cons, BSL.head, BSL.tail, fromHex)

rHexBS :: BS.ByteString -> BS.ByteString
rHexBS = rHex' (BS.null, BS.empty, BS.cons, BS.head, BS.tail, fromHex)

所以我直接在 rHex' 中传递所有需要的函数在功能 rHexBSL rHexBS .
是否有更多的 Haskell 方法可以为 Bytestring 和 Bytestring.Lazy 创建一个通用函数?
也许创建类型类或其他东西?

最佳答案

我会通过使用 [Word8] 来简化它。并使用 packunpack对于每种类型的 ByteString 来获得你想要的——例如:

toHex :: Word8 -> Word8 -> Word8
toHex a b = (fromHex a) * 16 + fromHex b

hexify :: [Word8] -> [Word8] -> [Word8]
hexify (a:b:cs) = toHex a b : hexify cs
hexify [b] = toHex 0 b
hexify [] = []

rHexBSL :: BSL.ByteString -> BSL.ByteString
rHexBSL = BSL.pack . hexify . BSL.unpack

rHexBS :: BS.ByteString -> BS.ByteString
rHexBS = BS.pack . hexify . BS.unpack

而且我认为这样做很有可能实现融合以提高运营效率。

也就是说,看看 Bryan 如何在他的 base16-bytestring` package 中做到这一点是很有启发性的。 .
  • encode for Data.ByteString
  • encode for Data.ByteString.Lazy
  • 关于haskell - Haskell 中 ByteString 和 ByteString.Lazy 的常用函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21597543/

    27 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com