2011-08-17 5 views
1

아직도 바이트 스팅 작업 방법을 모르겠다Haskell Bytestring 팩/포장 풀기

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

그러나 압축 풀기를 포장하는 것은 의미 [확인]을하지 않습니다.

음, 확실히 낭비입니다.

압축을 풀지 않고 양식을 작성하여 바이트를 읽을 수 없습니까?

  • 는 다른 형태로 변환하지 않고 데이터에 조작을 의미합니까? 물론 넌 할 수있어. 정확하게 당신이하고 싶은 것에 달려 있습니다. 나는 Word32의 집합으로 ByteString에 액세스하기 위해 FFI (그리고 나중에, Data.Vector.Storable)를 사용했다. 당신은 어떤 개인도 자연히 당겨 낼 수 있습니다. Word8. ByteString의 Haddock 문서를 보았을 것입니다 만, 다른 패키지가 직접 bytestrings을 소비한다는 것을 알고 있습니다 (예 : 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.drop m'이 메모리에 모든 것을로드하고 있습니까? – ArchHaskeller

+0

또한 벡터에 넣는 방법을 제공 할 수 있습니까? 감사합니다 – ArchHaskeller

+1

@ 하스 켈러 엄격한 bytestrings 들어? 네, 전체 파일을로드합니다. 'Data.ByteString.Lazy'를 가져 오면 첫 번째'n + m' 바이트 (가장 가까운 32K 경계로 반올림 됨) 만로드됩니다. –