在Haskell中将向量转换为字节字符串

4
我不知道如何将Data.Vector.Storable向量转换为ByteString。我猜应该有些很明显的东西我没想到。
我需要将它转换为ByteString,因为我想使用Network.Socket.ByteString通过网络发送数据,而ByteString似乎是最有效的数据结构。
我该怎么编写代码来实现这个函数呢?
writeToByteString :: Vector Int -> ByteString
writeToByteString v = 

非常感谢。

一个 ByteStringWord8 组成,你想如何将 Int 转换为 Word8?由于 Int 是平台特定的,这确实是棘手的部分。之后可以简单地使用 BS.pack . V.toList(尽管这可能不是最有效的方法)。 - bheklilr
1个回答

3

这取决于您实际想要实现什么。正如bheklilr所提到的,Int表示是特定于平台的。

但在幕后,可存储向量是一块内存。要获取其内容,请使用unsafeToForeignPtr0。以下是一个示例:

import qualified Data.Vector.Storable as V
import qualified Data.ByteString as BS

import Foreign

main :: IO ()
main = do
  let v = V.generate 10 id :: V.Vector Int
      (fptr, len) = V.unsafeToForeignPtr0 v
  print v
  bs <- withForeignPtr fptr $ \ptr ->
    BS.packCStringLen (castPtr ptr, len * sizeOf (undefined :: Int))
  print $ BS.unpack bs

输出:

fromList [0,1,2,3,4,5,6,7,8,9]
[0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,3,0,0,0,0,0,0,0,4,0,0,0,0,0,0,0,5,0,0,0,0,0,0,0,6,0,0,0,0,0,0,0,7,0,0,0,0,0,0,0,8,0,0,0,0,0,0,0,9,0,0,0,0,0,0,0]

非常感谢,这正是我想要的。我使用Int作为示例,但它可能需要支持几种基于C的类型。 - user3199023

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接