gpt4 book ai didi

haskell - 如何在 ByteString 和 Storable Vector 之间进行转换?

转载 作者:行者123 更新时间:2023-12-03 23:42:59 38 4
gpt4 key购买 nike

Storable.Vector Word8 之间转换的最佳方式是什么?和严格的ByteString ?

当然,非复制(无操作)方式将不胜感激。

我应该只是unsafeCoerce或者是否有一个库函数(我找不到)?

此外,Unboxed.Vector Word8 的方法是否相同? ?

最佳答案

一个简单的unsafeCoerce将不起作用,因为数据构造函数的布局不同:

data StorableArray i e = StorableArray !i !i Int !(ForeignPtr e)

对比
data ByteString = PS {-# UNPACK #-} !(ForeignPtr Word8) -- payload
{-# UNPACK #-} !Int -- offset
{-# UNPACK #-} !Int -- length

您可以导入 Data.Array.Storable.InternalsData.ByteString.Internal访问原始构造函数,然后在不复制数据的情况下构建另一个构造函数:
> let bs = pack [1,2,3]
> bs
"\SOH\STX\ETX"
> let sa = case bs of (PS ptr 0 n) -> StorableArray 0 (n-1) n ptr
> :t sa
sa :: StorableArray Int GHC.Word.Word8
> Data.Array.MArray.readArray sa 1
2
> Data.Array.MArray.readArray sa 0
1
> Data.Array.MArray.readArray sa 3
*** Exception: Ix{Int}.index: Index (3) out of range ((0,2))

(我删除了相当长的 Prelude Data.Array.Storable.Internals Data.ByteString.Internal Data.ByteString> 提示)。

这不适用于 Data.Vector.Unboxed ,因为这里的数据在 Haskell 堆上,由 GHC 运行时管理,而另外两个在 Haskell 堆外管理数据。

关于haskell - 如何在 ByteString 和 Storable Vector 之间进行转换?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18682527/

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