将String
(或ByteString
)逐位转换为整数类型的最有效方法是什么,例如:
smallEndianStringToInt32 :: ByteString -> Int32
smallEndianStringToInt32 str =
case str of
[a,b,c,d] -> shiftL d 24 .|. shiftL c 16 .|. shiftL b 8 .|. a
_ -> 0
在C中,我们可以这样做,非常低成本:
char* some_string = "....";
int32_t x = *(int32_t*)some_string;
但是前一个实现(smallEndianStringToInt32
)看起来并不像C代码那么快。
如何做到这一点? (或者它实际上是那么快?)
答案 0 :(得分:3)
我认为这可以满足您的需求,但与其他评论者一样,我建议您澄清您实际尝试做什么,因为这是非惯用的Haskell :
{-# LANGUAGE OverloadedStrings #-}
import Data.ByteString.Internal
import Foreign.Storable
import Foreign.ForeignPtr
import Foreign.Ptr
import Data.Word (Word32)
main :: IO ()
main = withForeignPtr fptr $ \ptr -> do
i <- peek $ castPtr (ptr `plusPtr` off)
print (i :: Word32)
where
PS fptr off len = "A\0\0\0"
应该非常明显,例如,此代码非常容易受到段错误的影响。