을 구조화. 각 "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를 사용하여 스트림을 사용하여 내 경험을 중지하고 싶습니다. 미리 감사드립니다.
FileStream에는 버퍼 크기를 제어하는 생성자 매개 변수가 있습니다. 고려해야 할 또 다른 사항은 운영 체제 자체도 버퍼링을한다는 것입니다. –
@JamesJohnston : 참으로. 나는 대부분의 시나리오에서 기본값이 좋을 것으로 기대한다. 나는 이것이 정말로 문제가되는지 의심 스럽다. –
동의합니다. 비록 C#이 아니지만 한 가지 예외가 있습니다. 사용하고 있던 C 런타임은 512 바이트 버퍼를 기본값으로 사용했습니다. 따라서 한 번에 4 바이트 씩 데이터 파일을 읽을 때 디스크 성능이 매우 느려집니다 (우리 프로그램에서). 물론, 프로그램이 적절한 작업을 수행하지 않더라도 운영 체제가 버퍼를 읽기 때문에 일반적으로 문제가되지 않습니다. –