有没有办法从 ByteString 对象中提取指向内存的底层直接指针?编译器说,我目前的方法是不正确的。
getPtr :: ByteString -> Ptr Word8
getPtr (PS ptr _ _) = ptr
有没有办法从 ByteString 对象中提取指向内存的底层直接指针?编译器说,我目前的方法是不正确的。
getPtr :: ByteString -> Ptr Word8
getPtr (PS ptr _ _) = ptr
使用unsafeUseAsCString
从Data.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
,但如果出现问题,您可以使用castPtr
fromForeign.Ptr
来解决这个问题。