如何获得ByteString的Ptr?

时间:2013-11-24 20:46:14

标签: haskell bytestring

有没有办法从ByteString对象中提取底层直接指向内存的指针? 编译说,我目前的做法是不正确的。

getPtr :: ByteString -> Ptr Word8
getPtr (PS ptr _ _) = ptr

1 个答案:

答案 0 :(得分:8)

使用Data.ByteString.Unsafe中的unsafeUseAsCString。它有类型:

ByteString -> (CString -> IO a) -> IO a

可以使用unsafeUseAsCString bs return来简单地获取指针,但这是非常不安全的,因为ByteString不能保证不移动,并且内存可能被释放在CString -> IO a函数终止后的任何时候,你应该只访问其中的指针;在内部,它使用Foreign.ForeignPtr.withForeignPtr引脚内存,因此如果发生GC,它将不会移动。根据文档:

  

在子计算终止后,内存可能会在任何时候释放,因此指向存储的指针必须在此之后

除非ByteString恰好是字符串,否则字符串也不会以空值终止,并且字符串CString(即Ptr CChar)而不是Ptr Word8 },但是你可以使用castPtr中的Foreign.Ptr来解决这个问题。