如何获得ByteString的Ptr?

dan*_*bst 5 haskell bytestring

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

getPtr :: ByteString -> Ptr Word8
getPtr (PS ptr _ _) = ptr
Run Code Online (Sandbox Code Playgroud)

Jon*_*rdy 8

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

ByteString -> (CString -> IO a) -> IO a
Run Code Online (Sandbox Code Playgroud)

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

在子计算终止后,内存可以在任何时候释放,因此在此之后不得使用指向存储的指针.

该字符串也不会以空值终止,除非ByteString碰巧是,并且它将具有类型CString(即),Ptr CChar而不是Ptr Word8,但如果它是一个问题,您可以使用castPtrfrom Foreign.Ptr来解决它.