Haskell:将String逐位转换为Integer的有效方法?

时间:2014-10-27 11:29:53

标签: haskell

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代码那么快。

如何做到这一点? (或者它实际上是那么快?)

1 个答案:

答案 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"

应该非常明显,例如,此代码非常容易受到段错误的影响。