6

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

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

1 回答 1

8

使用unsafeUseAsCStringData.ByteString.Unsafe. 它有类型:

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

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

子计算终止后,内存可能随时释放,因此在此之后不得使用指向存储的指针。

该字符串也不会以空值结尾,除非ByteString碰巧是,并且它将具有类型CString(即Ptr CChar)而不是Ptr Word8,但如果出现问题,您可以使用castPtrfromForeign.Ptr来解决这个问题。

于 2013-11-24T22:25:51.670 回答