有没有办法从ByteString对象中提取底层直接指向内存的指针? 编译说,我目前的做法是不正确的。
getPtr :: ByteString -> Ptr Word8
getPtr (PS ptr _ _) = ptr
答案 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
来解决这个问题。