2011-11-04 1 views
2

을 구조화. 각 "RECORD"은 다음과 같은 구조가 있습니다 내가 예를 들어 첫 번째 레코드를 사용을읽기 쓰기 내가 읽고 다음과 같은 구조를 가지고 바이너리 파일을 작성하려면 바이너리 파일

  • (빨간색) START 바이트 : 0x5A (항상 1 바이트, 고정 값 0x5A)
  • (녹색) 길이 바이트 : × 00 0x16 (항상 2 바이트, 값은 "0x00 0x02"에서 "0xFF 0xFF"로 바뀔 수 있습니다.)
  • (파란색) CONTENT : LENGTH 필드의 10 진수 값에서 2를 뺀 바이트 수입니다.이 경우 LENGHT 필드 값은입니다. 22 (0x00 0x16은 10 진수로 변환 됨) 따라서 CONTENT는 20 (22-2) 바이트를 포함합니다.

제 목표는 각 레코드를 하나씩 읽고 출력 파일에 쓰는 것입니다.

private void Read(BinaryReader binaryReader, BinaryWriter binaryWriter) 
{ 
    byte START = 0x5A; 
    int decimalLenght = 0; 
    byte[] content = null; 
    byte[] length = new byte[2]; 

    while (binaryReader.PeekChar() != -1) 
    { 
     //Check the first byte which should be equals to 0x5A 
     if (binaryReader.ReadByte() != START) 
     { 
      throw new Exception("0x5A Expected"); 
     } 

     //Extract the length field value 
     length = binaryReader.ReadBytes(2); 

     //Convert the length field to decimal 
     int decimalLenght = GetLength(length); 

     //Extract the content field value 
     content = binaryReader.ReadBytes(decimalLenght - 2); 

     //DO WORK 
     //modifying the content 

     //Writing the record 
     Write(binaryWriter, content, length, START); 
    } 
} 

private void Write(BinaryWriter binaryWriter, byte[] content, byte[] length, byte START) 
{ 
    binaryWriter.Write(START); 
    binaryWriter.Write(length); 
    binaryWriter.Write(content); 
} 

이 방법이 실제로 작동 : 사실 내가 읽기 기능과 쓰기 기능 (일부 의사)가 있습니다. 그러나 나는 아주 큰 파일을 다루고 있기 때문에 전혀 수행하지 못한다는 것을 알게된다. 왜냐하면 나는 3 번 foreach 레코드를 읽고 쓰게된다. 사실 내가 바이트의 작은 양의 버그 덩어리를 읽고 메모리에서 일하고 싶지만 BinaryReader 및 BinaryWriter를 사용하여 스트림을 사용하여 내 경험을 중지하고 싶습니다. 미리 감사드립니다.

답변

2

FileStream이 이미 버퍼링되어 있으므로 이 예상대로 작동합니다. 원래 스트림 주위에 항상 BufferedStream을 만들면 정말 필요한 경우 추가 버퍼링을 추가 할 수 있지만 큰 차이를 만들지는 모릅니다.

당신은 그것이 "전혀 수행하지 못한다"고합니다 - 얼마나 빨리 일까요? IO가 당신의 시간이가는 곳이라고 확신합니까? 코드의 프로파일 링을 수행 했습니까?

+0

FileStream에는 버퍼 크기를 제어하는 ​​생성자 매개 변수가 있습니다. 고려해야 할 또 다른 사항은 운영 체제 자체도 버퍼링을한다는 것입니다. –

+0

@JamesJohnston : 참으로. 나는 대부분의 시나리오에서 기본값이 좋을 것으로 기대한다. 나는 이것이 정말로 문제가되는지 의심 스럽다. –

+0

동의합니다. 비록 C#이 아니지만 한 가지 예외가 있습니다. 사용하고 있던 C 런타임은 512 바이트 버퍼를 기본값으로 사용했습니다. 따라서 한 번에 4 바이트 씩 데이터 파일을 읽을 때 디스크 성능이 매우 느려집니다 (우리 프로그램에서). 물론, 프로그램이 적절한 작업을 수행하지 않더라도 운영 체제가 버퍼를 읽기 때문에 일반적으로 문제가되지 않습니다. –

1

2 개의 별도 읽기 대신 처음에 3 (또는 6?) 바이트를 읽는 것이 좋습니다. 초기 바이트를 작은 배열에 넣고 5a ck 바이트를 확인한 다음 2 바이트 길이 표시기를 확인한 다음 3 바이트 AFP op 코드를 확인한 다음 AFP 레코드의 나머지를 읽습니다.

작은 차이가 있지만 읽은 통화 중 하나를 제거합니다. ,

나는 더 존 소총는 아니지만, 나는 아주 잠시 동안이 나라에서 가장 큰 인쇄 & 메일 상점 중 하나에서 일을했고, 우리는 일반적으로 C에서 (

:-) 대부분 AFP 출력했다)

관련 문제