Haskell Bytestring包装/拆包

Haskell Bytestring包装/拆包,haskell,bytestring,Haskell,Bytestring,我还是不明白bytestrings是怎么工作的 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 我知道ByTestRing可以用来快速高效地读取大量数据。但是打开包装是没有意义的 let z = readArray x 1 --can you

我还是不明白bytestrings是怎么工作的

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
我知道ByTestRing可以用来快速高效地读取大量数据。但是打开包装是没有意义的

let z = readArray x 1 --can you read the bytestring like its a array?(something like this)
你不能在不解包的情况下读取bytestring格式的数据吗?或者只是解包一段数据

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

但打包一个拆包是没有意义的

嗯,这当然是浪费

你不能在不解包的情况下读取bytestring格式的数据吗

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

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

或者只是解包一段数据

当然可以:

但打包一个拆包是没有意义的

嗯,这当然是浪费

你不能在不解包的情况下读取bytestring格式的数据吗

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

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

或者只是解包一段数据

当然可以:


对于您想要执行的操作,您是否有更具体的示例?对于您想要执行的操作,您是否有更具体的示例?将
getpartion n m=B.unpack。拿n。B.drop m
是否将所有内容都加载到内存中?@Haskellers是否严格执行bytestring?是的,这将加载整个文件。如果导入
Data.ByteString.Lazy
,则只加载第一个
n+m
字节(四舍五入到最接近的32K边界)。@Haskeller要转换为向量,步骤是
ByteString->ForeignPtr
ForeignPtr->vector
。也就是说:
convertBStoVector=let(ptr,off,len)=B.toForeignPtr in V.unsafeFromForeignPtr ptr off len
,在这里您已经完成了
导入数据.ByteString.Internal as B
导入数据.Vector.Storable as V
(参见ByteString和Vector包)。似乎应该对这种转换进行校准,不是吗?虽然我认为将依赖项添加到
bytestring
vector
@acfoltzer中是浪费,但另一个选项是添加一个包。我不会这么做的原因是,需要该软件包的人不会知道/找到它,而想了解它的人(通过p.h.o、h.r.c、cafe等)可能只是自己编写代码,而不是为一个或两个函数库添加依赖项。拿n。B.drop m是否将所有内容都加载到内存中?@Haskellers是否严格执行bytestring?是的,这将加载整个文件。如果导入
Data.ByteString.Lazy
,则只加载第一个
n+m
字节(四舍五入到最接近的32K边界)。@Haskeller要转换为向量,步骤是
ByteString->ForeignPtr
ForeignPtr->vector
。也就是说:
convertBStoVector=let(ptr,off,len)=B.toForeignPtr in V.unsafeFromForeignPtr ptr off len
,在这里您已经完成了
导入数据.ByteString.Internal as B
导入数据.Vector.Storable as V
(参见ByteString和Vector包)。似乎应该对这种转换进行校准,不是吗?虽然我认为将依赖项添加到
bytestring
vector
@acfoltzer中是浪费,但另一个选项是添加一个包。我不会这么做的原因是,需要该软件包的人不会知道/找到它,而想了解它的人(通过p.h.o、h.r.c、cafe等)可能只是自己编写代码,而不是为一个或两个函数库添加依赖项。
import Data.ByteString as B

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