2014-09-15 1 views
1

파일 정보 : 처음 4 바이트에는 파일의 레코드 수가 포함됩니다. 다음 4 바이트는 첫 번째 레코드의 길이를 포함합니다. 다시 처음 기록한 후 4 바이트는 두 번째 레코드의 길이를 포함합니다. 전체 파일은 다음과 같습니다. 그래서 입력 파일을 읽고 처음 4 바이트는 건너 뜁니다. 그 후에 나는 곧 나오는 레코드의 길이를 줄 문자열에 레코드를 쓰고 그 과정을 반복 할 4 바이트를 읽을 필요가있다.C#에서 16 진수 모드로 입력 파일 읽기

나는 내가 얻고 자하는 것을 얻지 못했습니다. 예를 들면 다음과 같습니다. 7F CB 00 00의 경우 32715를 가져야합니다 (필자는 필요하지 않으며 건너 뛸 필요가 있음). 다음 4 바이트는 00 D3 00 00 00입니다. 211을 얻지 만 얻지는 못합니다.

도움을 주시면 감사하겠습니다.

private void button1_Click(object sender, EventArgs e) 
    { 
     FileStream readStream; 
     readStream = new FileStream(singlefilebox.Text,FileMode.Open,FileAccess.Read); 
     BinaryReader readBinary = new BinaryReader(readStream); 


     byte inbyte; 
     inbyte = readBinary.ReadByte(); 
     string outbyte; 
     while (readBinary.BaseStream.Position < readBinary.BaseStream.Length) 
     { 
      inbyte = readBinary.ReadByte(); 
      outbyte = Convert.ToString(inbyte); 
     } 
+0

코드의 실제 출력은 무엇입니까? 예상 된 결과와 비교하여 깨진 내용을 찾아내는 데 도움이됩니다. – Alex

+0

바이트 순서가 생각하는대로 해석되지 않을 수 있습니다. http://en.wikipedia.org/wiki/Endianness –

+0

7000에 대한 20300021100127241241 CB 00 00 00 D3 00 00 7F F1 F1 F1 F5 F8 F4 F3 7F .... – Victor

답변

0

첫 번째 문제는 출력하는 방법입니다. outbyte를 생성 할 때 그것은 10 진수 표기법으로 변환됩니다.

outbyte = Convert.ToString(String.Format("{0:X}", inbyte)); 

이 16 진수의 문자열 표현을 인쇄 : 예를 들어, CB는 203

변경에 다음에 outbyte를 생성하는 라인을 변환된다.

문자열 서식에 대한 자세한 내용은이 답변을 참조하십시오. String.Format for Hex

더 큰 문제는 적절한 방식으로 바이트를 결합해야한다는 것입니다. 각 바이트를 읽고 8 비트 씩 이동 한 후 다음 바이트를 추가해야합니다.

 string fileName = @"..\..\TestInput.hex"; 
     FileStream readStream; 
     readStream = new FileStream(fileName, FileMode.Open, FileAccess.Read); 
     BinaryReader readBinary = new BinaryReader(readStream); 

     byte inbyte; 
     string outbyte; 
     int value; 

     inbyte = readBinary.ReadByte(); // read in the value: 7F in hex , 127 in decimal 
     value = inbyte << 8; // shift the value 8 bits to the left: 7F 00 in hex, 32512 in decimal 
     inbyte = readBinary.ReadByte(); // read in the next value: CB in hex, 203 in decimal 
     value += inbyte; // add the second byte to the first: 7F CB in hex, 32715 in decimal 
     Console.WriteLine(value); // writes 32715 to the console 
+0

나는 당신의 요점을 얻는다. 그러나, 나는 다른 길을 원한다. 나는 '7F CB 00 00'이라는 입력을 32715로 나눠 주겠다. 내 문제는 inbyte = readBinary.ReadByte();에서 멈출 때이다. 7F는 127 점, CB는 203 점입니다. 대신, 나는 먼저 7F를 가져오고 나중에 outbyte = Convert.ToString (inbyte)에서 문자열로 변환하려고합니다. – Victor

+0

나는 당신이 무엇을 요구하고 있는지 완전히 확신하지 못합니다. 코드 끝 부분에서 값은 32715로 설정됩니다. 0x7f = 127 및 0xCB = 203입니다. 32715 바이트의 아웃 바이트를 얻으려면 0x7FCB가 있어야합니다. 0x7F는 상위 바이트입니다. – epotter