2011-09-20 54 views
1

基本上我读了5个字节对应的数量,但我想将其转换为Word64。什么是最好的方法来做到这一点?如何将ByteString转换为适当大小的Word?

编辑:我也应该说这是在内部循环运行,所以性能是至关重要的。理想情况下 我想这样做:

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

或类似的东西。

+1

这些字节的数量是如何编码的? –

+0

这是5个字节,我假设一个由40位组成的大尾字词 – nimish

回答

1

如果你只是想要一个简单的功能,假设大端字节顺序,这一个应该做的工作:

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

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

+0

当然,我甚至没有想过插入虚拟填充。但是,这似乎有点过分,创建和销毁一些中间数据结构。 – nimish

+0

@nt。我不会担心太多,但我已经为我的答案添加了一个更简单的替代方案。 – hammar

0

正如哈马说,二进制(和严格的字节串版本,谷物)是伟大的,但他们measuably比最快的解决方案(它们执行哈马的解决方案提出的相同移)慢。

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

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

如果你愿意加入集结出发,同样快的解决方案是使用Vector.Storable从矢量包。

注意这些都不处理你的5个字节的大端格式,所以你需要更改数据制片人这是有用的。

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