1

基本上我已经读取了对应于数量的 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])

或类似的东西。

4

2 回答 2

1

如果你只想要一个简单的函数,假设大端字节顺序,这个应该可以完成工作:

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

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

于 2011-09-20T17:19:41.467 回答
0

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

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

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

如果您愿意添加构建dep,同样快速的解决方案是使用Vector.Storable矢量包。

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

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

于 2011-09-20T22:09:44.390 回答