【问题标题】:Haskell Bytestring pack/unpackHaskell Bytestring 打包/解包
【发布时间】:2016-05-10 20:26:50
【问题描述】:

我还是不明白字节串是如何工作的

import qualified Data.ByteString.Lazy as BS
let x = BS.readFile "somefile.txt" --some large file
let z = ((reverse (BS.unpack x)) !! 2) --do stuff here

我知道字节串可以用来读取大量数据,非常快速有效。但是拆包装没有意义。

let z = readArray x 1 --can you read the bytestring like its a array?(something like this)

你不能不解包就读取字节串形式的数据吗?还是只是解压一部分数据?

你能解释一下它是如何工作的吗?(代码示例)

【问题讨论】:

  • 您有更具体的示例来说明您想要执行的操作吗?

标签: haskell bytestring


【解决方案1】:

但是打包拆包没有意义。

嗯,这肯定是浪费。

不解包就不能直接读取字节串形式的数据吗?

  • 您的意思是对数据进行操作而不将其转换为另一种形式?你当然可以。具体如何取决于你想做什么。我使用 FFI(以及后来的 Data.Vector.Storable)将 ByteString 作为一组Word32 访问。您可以自然地拉出任何个人Word8。我确定您已经看过 ByteString 的 Haddock 文档,但知道其他包直接使用字节串(例如:用于将图像缓冲区与通过 FFI 调用的 C 代码进行通信)。

  • 您的意思是“在不使用[Word8][Char] 的情况下对数据进行操作”?二进制、谷物和其他包可用于将字节串解析为任意类型。

或者只是解压一部分数据?

当然:

import Data.ByteString as B

getPortion n m = B.unpack . B.take n . B.drop m

【讨论】:

  • getPortion n m = B.unpack . B.take n . B.drop m 会将所有内容加载到内存中吗?
  • @Haskellers 对于严格的字节串?是的,这将加载整个文件。如果您导入了Data.ByteString.Lazy,那么它只会加载第一个n+m 字节(四舍五入到最近的32K 边界)。
  • @Haskeller 转换为向量的步骤是ByteString -> ForeignPtrForeignPtr -> Vector。即:convertBStoVector = let (ptr,off,len) = B.toForeignPtr in V.unsafeFromForeignPtr ptr off len 你在哪里完成了import Data.ByteString.Internal as Bimport Data.Vector.Storable as V(参见字节串和向量包)。
  • 看来这个转换应该被库化,不是吗?虽然我认为将依赖项添加到 bytestringvector 会很浪费。
  • @acfoltzer 另一个选项是添加一个包。我不会的原因是需要该包的人不会知道/找到它,而会了解它的人(通过 p.h.o、hr.r.c、cafe 等)可能只是自己编写代码而不是添加依赖项一个或两个函数库。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-09-05
  • 1970-01-01
  • 2013-02-27
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多