2011-08-17 32 views
1

我還沒有得到字節串是如何工作的哈斯克爾字節串包/解壓

import qualified Data.ByteString.Lazy as BS 
let x = BS.readFile "somefile.txt" --some large file 
let z = ((reverse (BS.unpack x)) !! 2) --do stuff here 

我知道字節串,可以用來讀取大量數據,非常快速,高效地。但拆包裝沒有意義。

let z = readArray x 1 --can you read the bytestring like its a array?(something like this) 

難道你不能在沒有解包的情況下以字節串形式讀取數據嗎?或者只是解壓縮一部分數據?

你能解釋一下它是如何工作的?(代碼示例)

+0

你在操作的心中有一個更具體的例子,你想執行? – acfoltzer

回答

8

但包裝一個拆包不[作出]感。

嗯,這肯定是浪費。

難道你不能在沒有解包的情況下以字節串形式讀取數據嗎?

  • 你的意思,而不將其轉換爲另一種形式對數據進行操作?你當然可以。究竟如何取決於你想要做什麼。我已經使用FFI(以及後來的Data.Vector.Storable)以一組Word32的形式訪問ByteString。你可以自然地抽出任何個人Word8。我確定你已經看過ByteString的Haddock文檔,但是知道其他包直接使用字節串(例如:用於通過FFI調用帶有C代碼的圖像緩衝區)。

  • 您的意思是「在不使用[Word8][Char]」的情況下對數據進行操作?二進制,穀類和其他包可用於將字節字符解析爲任意類型。

或只是解壓縮數據的片段?

肯定的:

import Data.ByteString as B 

getPortion n m = B.unpack . B.take n . B.drop m 
+0

會'getPortion n m = B.unpack。 B.take n。 B.drop m'將所有內容加載到內存中? – ArchHaskeller

+0

你也可以提供如何把它放在一個向量?謝謝 – ArchHaskeller

+1

@Haskellers對於嚴格的字節串?是的,這將加載整個文件。如果你導入了'Data.ByteString.Lazy',那麼它只會加載第一個'n + m'個字節(四捨五入到最接近的32K邊界)。 –