2010-11-26 4 views
0

바이트 배열 모음을 읽고있는 이진 파일이 있습니다.바이너리 파일을 바이트 배열로 읽는 방법?

파일에 여러 개의 (임의의 숫자) 레코드가 포함되어 있습니다. 본질적으로 바이트 블록. 각 레코드의 길이는 임의입니다.

파일의 헤더는 각 레코드의 오프셋을 제공합니다.

record 0: offset 2892 
record 1: offset 4849 
.... 
record 98: offset 328932 
record 99: offset 338498 

루프를 수행하고 각 레코드를 바이트 배열로 읽는 코드를 작성했습니다. 오프셋의 차이를 보면 레코드 크기가 나옵니다. 오프셋을 검색 한 다음 ReadBytes()를 호출하면 해당 레코드가 해당 배열로 읽습니다.

내 현재의 불완전한 해결 방법은 마지막 레코드에서 작동하지 않습니다. 마지막 레코드를 어떻게 배열로 읽어 낼 것인가?

이유는 무엇입니까? 각 레코드는 암호화되어 있으므로 별도로 해독해야합니다. 각 레코드를 바이트 배열로 읽는 코드를 작성하고 있습니다. 암호 해독 후 모든 레코드를 다시 파일에 기록하십시오.

코드는 요청에 추가 :

//recordOffsets contain byte location of each record start. All headers (other than universal header) are contained within record 0. 
    recordBlocks = new List<RecordBlock>(); 

    //store all recordOffsets. Record0 offset will be used to load rest of headers. Remaining are used to parse text of eBook. 
    for (int i = 0; i < standardHeader.numRecs; i++) 
    { 
     RecordBlock r = new RecordBlock(); 
     r.offset = bookReader.ReadInt32(EndianReader.Endian.BigEndian); 
     r.number = bookReader.ReadInt32(EndianReader.Endian.BigEndian); 
     recordBlocks.Add(r); 
    } 

    foreach (RecordBlock r in recordBlocks) 
    { 
     if (r.number == recordBlocks.Count) 
     { 
      ///deal with last record 
     } 
     else 
     { 
      r.size = recordBlocks[(r.number) + 1].offset - r.offset; 
     } 
     bookReader.Seek(r.offset, SeekOrigin.Begin); 
     r.data = bookReader.ReadBytes(r.size);    
    } 
+0

몇 가지 코드를 게시 할 수 있습니까? – TalentTuner

+0

지금까지 코드를 보여줄 수 있습니까? – Aamir

답변

3

FileInfo 클래스의 Length 속성을 사용하여 총 바이트 수를 결정할 수 있으므로 마지막 레코드의 바이트 수를 계산할 수도 있습니다.
따라서 현재 논리를 대부분 유지할 수 있습니다.

+0

나는 그것을 시도 할 것이다. 그렇지 않다면 나는 Aamir "break it"방법을 시도 할 것이다. 바이트 배열을 출력하는 ReadToEnd 메서드와 같은 것이 있었으면합니다. –

+0

빙고. 당신이 그것에 대해 생각하게 만들었 더라면 실제로 구현하기 쉬웠습니다. 위의 if 블록 안에 한 쌍의 줄을 추가했습니다. 나는 나중에 코드를 정리 (나중에 파일 크기를 가져오고 저장) 할 것입니다. FileInfo f = 새 FileInfo (inFile); r.size = (int) f.Length - r.offset; –

5

System.IO.File.ReadAllBytes()는 바이트 배열의 모든 바이트를 읽 그 후이 기록에 의한 바이트 배열 기록에서 읽을 수 있습니다.

+0

그래, 그걸 생각하고 있었어. 하나의 "마스터 배열"을 읽고 일련의 복사본을 사용하여 레코드로 나눕니다. –

0

나는 .net 사람이 아니지만 몇 가지 옵션이있는 것 같습니다. 파일의 크기를 알 수있는 방법이 있어야합니다. 그걸 발견하면 모든 것을 읽을 수 있습니다. binaryreader.readbytes()에 대한 msdn 설명은 스트림에 포함 된 것보다 mroe를 요청하면 파일에있는 내용을 가져옵니다. 당신이 읽고있는 얼룩의 최대 크기를 아십니까? 그렇다면 미리 읽은 메모리에 읽으십시오.

1

내게 보이는 문제는 마지막 레코드의 실제 레코드 크기를 어떻게 얻을 수 있습니까?

이 정보를 헤더에 명시 적으로 추가하면 코드가 내 생각에 매력으로 작동합니다.

+0

파일의 레이아웃을 제어 할 권한이 없습니다. 질문에서 분명하지 않습니다. 할 수만 있다면 파일로 바꿀 수있는 많은 것들이 있다는 것을 믿어주십시오. –

+0

:) 그래, 문제가있어. 내가 뭔가 다른 것을 생각하게하자. – TalentTuner

+0

Aamir 솔루션은 비싸지 만, 나는 그 중 하나를 시도해야한다고 생각한다. – TalentTuner

관련 문제