如何将ByteString转换为适当大小的Word?

时间:2011-09-20 16:47:14

标签: parsing haskell bytestring

基本上我读了5个字节,对应一个数量,但我想将它转换为Word64。最好的方法是什么?

编辑:我还应该说这是在内循环中运行,因此性能至关重要。理想的情况下 我想做点什么:

uint64_t word = 0;
char bytes[5] = getbytes(5)
word += (bytes[0] << 32) 
        + (bytes[1] << 24) 
        + (bytes[2] << 16) 
        + (bytes[3] << 8) 
        + (bytes[4])

或类似的东西。

2 个答案:

答案 0 :(得分:1)

如果你只想要一个简单的函数,假设是big-endian字节顺序,那么这个应该完成这个工作:

foo :: B.ByteString -> Word64
foo = B.foldl' (\x y -> x * 256 + fromIntegral y) 0

但是,如果您正在阅读大量二进制数据,则可能需要考虑使用binary package

答案 1 :(得分:0)

正如Hammar所说,二进制(以及严格的字节串版本,谷物)很棒,但它们比最快的解决方案慢得多(它们执行Hammar解决方案中提出的相同移动)。

我发现简单的FFI例程是最快的解决方案:

getNthWord n b = inlinePerformIO (unsafeUseAsCString b (flip peekElemOff n . castPtr))

如果您愿意添加build-dep,同样快速的解决方案是使用vector包中的Vector.Storable

请注意,这些都不会处理您的5字节大端格式,因此您需要更改数据生成器以使其有用。

PS FFI解决方案假设字对齐。当用户在非x86系统上运行该例程时,我最初遇到了一个错误。