2014-08-29 2 views
1

C#의 System.IO에서 BinaryReader를 사용하여 이진 파일을 읽습니다. 그러나 ReadString을 사용할 때 첫 번째 바이트는 읽지 않습니다. 여기 코드가 있습니다.C#에서 BinaryReader의 Readstring 첫 번째 바이트를 읽지 않습니다

using (var b = new BinaryReader(File.Open(open.FileName, FileMode.Open))) 
{ 
    int version = b.ReadInt32(); 
    int chunkID = b.ReadInt32(); 
    string objname = b.ReadString(); 
} 

는 정말 열심히 일하지가 먼저 두 가지의 int를 읽지 만 objame을 반환하도록되어 문자열 "박쥐"이며, 대신이 "에서"반환합니다.

내가 처음 읽은 두 개의 int와 관련이 있습니까? 아니면 첫 번째 int와 문자열 사이에 null 바이트가없는 것일까 요?

미리 감사드립니다.

+3

첫 번째 문자열이 실제로 4 바이트 길이가되기 전에 확실한가요? 아마도 파일을 쓰는 코드를 게시해야할까요? – BradleyDotNET

답변

3

는 itsme86는 그의 대답에 쓴 것처럼 BinaryReader.ReadString() 작동의 그것의 자신의 방법을 가지고 있으며, 생성 된 파일이 BinaryWriter.Write(string val)을 사용하는 경우에만 사용해야합니다.

경우에 따라 BinaryReader.ReadChars(int count)을 사용할 수있는 고정 크기 문자열이 있거나 0 바이트가 발생할 때까지 읽어야하는 널 (null) 종료 문자열이있을 수 있습니다. null로 끝나는 문자열을 읽을 수있는 확장 메서드는 다음과 같습니다.

public static string ReadNullTerminatedString(this System.IO.BinaryReader stream) 
{ 
    string str = ""; 
    char ch; 
    while ((int)(ch = stream.ReadChar()) != 0) 
     str = str + ch; 
    return str; 
} 
+0

글쎄 그것은'BinaryWriter.Write'로 만들 필요는 없으며 단지 [파스칼 문자열] (http://en.wikipedia.org/wiki/String_%28computer_science%29#Length-prefixed)이어야합니다. . –

3

파일의 문자열 앞에는 7 비트 길이의 인코딩이 있어야합니다. MSDN :

현재 스트림에서 문자열을 읽습니다. 문자열에는 한 번에 7 비트 씩 정수로 인코딩 된 길이가 접두사로 붙습니다.

관련 문제