2011-09-20 70 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系統上運行該例程時,我原本有一個錯誤。