2013-10-31 1 views
3

나는 파서에서 UDP 정보를 받고 파싱하고 저장하고있다. 그렇게하려면 대부분 이진 정보이므로 BinaryReader을 사용하고 있습니다. 그 중 일부는 문자열이 될 것입니다. ReadString()의 경우 MSDN says function :BinaryReader 길이를 지정하는 ReadString?

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

그리고 나는 테스트를 시작할 때까지 단순히 무시하려고 시도한 "한 번에 7 비트"까지 완전히 이해합니다. MemoryStream에 넣기 전에 자신의 바이트 배열을 만들고 BinaryReader으로 읽으려고합니다. 여기에 내가 처음 일 것이라고 생각 무엇 :

byte[] data = new byte[] { 3, 0, 0, 0, (byte)'C', (byte)'a', (byte)'t', } 
BinaryReader reader = new BinaryReader(new MemoryStream(data)); 
String str = reader.ReadString(); 

int 4 바이트입니다 알고 (주위 충분히 BinaryReader 리틀 엔디안인지를 확인하려면 놀겠) 내가 3의 길이와 해당 문자를 전달합니다. 그러나 str\0\0\0을 유지합니다. 나는 3 0을 제거하고 단지

byte[] data = new byte[] { 3, (byte)'C', (byte)'a', (byte)'t', } 

이있는 경우 그 다음 읽고 제대로 저장 Cat을. 나에게 이것은 길이가 정수라고 말하는 문서와 충돌한다. 이제는 데이터 형식이 int이 아닌 소수점 이하의 숫자를 의미한다고 생각하기 시작했습니다. 이것은 BinaryReader이 127 문자보다 큰 문자열을 읽을 수 없다는 것을 의미합니까 (이는 설명서의 7 비트 부분에 해당하는 01111111이 될 것입니다)?

나는 프로토콜을 작성 중이며 우리의 문서를 고객에게 전달하기 전에 내가 무엇을 얻고 있는지 완전히 이해할 필요가있다.

+1

BinaryReader는 BinaryWriter로 작성된 내용을 읽도록 설계되었습니다. 그래서 BinaryWriter로 다른 길이의 문자열을 쓰는 시도하고 당신은 프로토콜을 알아낼 수 있어야합니다. –

+0

하지만 문자열 앞에 접두어가 붙지 않을 때 UDP 프로토콜이 어떻게 데이터를 보내는 지 알아 내야합니다. 그럴 가능성이 가장 큽니다. 모두 헛된 것입니다. –

+0

http://msdn.microsoft.com/en-us/library/dd946975%28v=office.12%29.aspx – Ralf

답변

6

BinaryReader에 대해 source code을 찾았습니다. 그것은 Read7BitEncodedInt()를라는 함수를 사용하고 해당 문서와 Write7BitEncodedInt()에 대한 문서를 찾는 후 나는이 발견 :

값 매개 변수의 정수는 일곱 최하위부터 시작하여 번에 일곱 개 비트를 기록

비트. 의 상위 비트는이 바이트 이후에 더 많은 바이트가 기록되는지 여부를 나타냅니다. 값이 7 비트에 맞으면 1 바이트의 공간 만 사용합니다. 값이 7 비트에 맞지 않으면 상위 비트는 첫 번째 바이트에 설정되고 쓰여집니다. 값은 7 비트만큼 시프트되고 다음 바이트가 기록됩니다. 이 프로세스는 전체 정수가 으로 기록 될 때까지 반복됩니다.

또한 랄프는 무슨 일이 벌어지고 있는지 더 잘 표시하는 this link을 발견했습니다.

+0

그러나 Big Endian 시스템에서 실행되는 프로그램에서 이진 스트림을 작성한 다음 Little Endian 시스템의 다른 프로그램에서이 파일을 읽는 경우 (예 : 파일이 전송 된 경우) 나는 그들이 그것을 놓쳤다 고 생각한다. Big Endian (네트워크 바이트 순서)에 스트림을 쓰는 응용 프로그램을 작성하고 있습니다. –