【问题标题】:Many types of String (ByteString)多种类型的字符串(ByteString)
【发布时间】:2023-03-04 21:55:01
【问题描述】:

我希望压缩我的应用程序的网络流量。

根据(最新?)"Haskell Popularity Rankings"zlib 似乎是一个非常流行的解决方案。 zlib的接口使用ByteStrings:

compress :: ByteString -> ByteString
decompress :: ByteString -> ByteString

我使用的是常规的Strings,这也是readshowNetwork.Socket使用的数据类型:

sendTo :: Socket -> String -> SockAddr -> IO Int
recvFrom :: Socket -> Int -> IO (String, Int, SockAddr)

所以要压缩我的字符串,我需要一些方法将String 转换为ByteString,反之亦然。 在hoogle的帮助下,我发现:

Data.ByteString.Char8 pack :: String -> ByteString

尝试使用它:

Prelude Codec.Compression.Zlib Data.ByteString.Char8> compress (pack "boo")

<interactive>:1:10:
    Couldn't match expected type `Data.ByteString.Lazy.Internal.ByteString'
           against inferred type `ByteString'
    In the first argument of `compress', namely `(pack "boo")'
    In the expression: compress (pack "boo")
In the definition of `it': it = compress (pack "boo")

失败,因为 (?) ByteString 的类型不同?

所以基本上:

  • ByteString 有几种类型?有哪些类型,为什么?
  • Strings 转换为ByteStrings 的“方法”是什么?

顺便说一句,我发现它确实适用于 Data.ByteString.Lazy.Char8ByteString,但我仍然很感兴趣。

【问题讨论】:

    标签: haskell bytestring


    【解决方案1】:

    有两种字节串:严格(在Data.Bytestring.Internal 中定义)和惰性(在Data.Bytestring.Lazy.Internal 中定义)。如您所见,zlib 使用惰性字节串。

    【讨论】:

    • 没有。 Char8 模块只是为相同的字节串提供不同的接口。
    【解决方案2】:

    你要找的功能是:

    import Data.ByteString as BS
    import Data.ByteString.Lazy as LBS
    
    lazyToStrictBS :: LBS.ByteString -> BS.ByteString
    lazyToStrictBS x = BS.concat $ LBS.toChunks x
    

    我希望它可以在没有 x 的情况下写得更简洁。 (即无积分,但我是 Haskell 的新手。)

    【讨论】:

    • 点赞lazyToStrictBS = BS.concat . LBS.toChunks
    【解决方案3】:

    一个更有效的机制可能是切换到一个完整的基于字节串的层:

    • network.bytestring 用于字节串套接字
    • 用于压缩的惰性字节串
    • bytestring-show 的二进制文件替换 Show/Read

    【讨论】:

    • @dons: 看来我需要使用 Network.Socket.ByteString.Lazy 来与 zlib 兼容,但与 Network.Socket.ByteString 不同的是,它没有实现 sendTo 和 recvFrom,因此实现了不适合我。
    • 我认为将惰性字节串块流式传输到单独的套接字中并不难。它本质上是 mapM_ send 。 fromChunks
    • @dons:在使用 UDP 时,如果您将数据包全部或分块发送,实际上会有所不同。但是您是否还说惰性字节串和严格字节串之间的转换很容易?知道这会很有用..
    • @yairchu - Data.ByteString.Lazy 中的函数 toChunksfromChunks 在严格和惰性字节串之间转换。
    猜你喜欢
    • 2013-09-22
    • 2013-01-07
    • 2019-05-12
    • 1970-01-01
    • 1970-01-01
    • 2013-06-13
    • 1970-01-01
    • 1970-01-01
    • 2019-01-16
    相关资源
    最近更新 更多