基本上我读了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])
或类似的东西。
答案 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系统上运行该例程时,我最初遇到了一个错误。