2017-03-29 2 views
0

텍스트 형식이 아닌 다른 형식의 파일을 읽는 방법을 이해하는 데 몇 가지 문제가 있습니다. 주어진 파일 안에는 문자열과 같은 정보가 있다는 것을 알고 있습니다. 필자는 16 진수 코드를 텍스트 파일에 작성하여이 프로세스의 다른 기능에 많은 도움이되었습니다. 왜냐하면 16 진수 코드의 일부 조합 후에도 파일에 문자열이 기록 될 수 있기 때문입니다.C# 이진 파일의 문자열 읽기

예를 들어이 배치는 16 진수입니다. 00 39 AF 32 DD 24 BA 09 07 06 03 DB 16 진수 코드가 AF 32와 같을 때 다음 정보는 문자열이어야합니다. 예 : '인보이스 번호 223232'

도움이나 참고 자료를 보내 주시면 감사하겠습니다. 당신은 이진 파일이 아닌 진수로 인코딩 된 텍스트 파일을 읽기 위해 노력하고있다처럼 당신이 샘플 코드를 보이는

static void Main(string[] args) 
    { 
     StreamWriter writer = new StreamWriter("output.txt", true); 
     FileStream fs = new FileStream("File", FileMode.Open); 
     int hexIn; 
     String hex; 
     for (int i = 0; (hexIn = fs.ReadByte()) != -1; i++) 
     { 
     writer.Write(hexIn + " "); 
     hex = string.Format("{0:X2}", hexIn); 
     writer.Write(hex + " "); 
     } 
    } 
+0

데이터 샘플을 표시 하시겠습니까? – Trey

+0

다음과 같이 해보십시오 : string input = "00 39 AF 32 DD 24 BA 09 07 06 03 DB"; byte [] output = input.Split (new char [] { ''}, StringSplitOptions.RemoveEmptyEntries) .Select (x => byte.Parse (x, System.Globalization.NumberStyles.HexNumber)). ToArray(); – jdweng

+1

참고, DD 24 BA 09 07 06 03 DB는 내가 본 일반적인 텍스트 인코딩에서 문자열을 찾지 않습니다 ... – Tim

답변

0

종류, 안부.

원본 파일이 이진 파일 인 경우 (이상적) 바이트 단위로 읽은 다음 상태 시스템을 통해 실행하여 문자열 예상시기를 알 수 있습니다. 문자열이 얼마나 오래인지 알아야합니다. 아래 샘플에서는 null로 끝나는 C 스타일의 문자열을 가정합니다. 파스칼 스타일 문자열의 경우 길이 접두사를 읽거나 고정 폭의 경우 예상되는 문자 수를 추적합니다. 당신이 진수로 인코딩 된 텍스트 파일을 읽는 경우 한 번에 육각 니블을 읽고 바이트를 재구성해야 할 것 같은

bool done = false; 
int state = 0; 
StringBuilder result = new StringBuilder(); 
while (!done) { 
    int byteValue = fs.ReadByte(); 
    if (bytesValue == -1) 
     done = true; 
    else { 
     switch (state) { 
     case 0: //looking for 0xAF 
      if (byteValue == 0xAF) 
       state = 1; 
      break; 
     case 1: //looking for 0x32 
      if (byteValue == 0x32) 
       state = 2; 
      else 
       state = 0; 
      break; 
     case 2: //start reading string 
      if (byteValue == 0) {//end of C-style string 
       //Do something with result.ToString() 
       result.Clear(); 
       state = 0; //go back to looking for more strings 
      } else { 
       result.Append((char)byteValue); //assuming 8-bit ASCII string 
      } 
      break; 
     } 
    } 
} 

, 그것은 더 어려울 수 있지만, 상태 머신 접근 방식은 유사하다.

+0

안녕하세요, 당신 말이 맞습니다. 이진 파일입니다. 귀하의 코드를 시도했지만 byteValue는 0xAF 또는 0x32가 아닌 int 숫자를 반환합니다. – Faqundo

+0

'(char) byteValue' 또한 ISO 8859-1을 전제로합니다. 그러나 왜 그렇게 가정하고 왜 그렇게 신기하게 쓰는가? 텍스트가 아니라 인코딩 된 텍스트가 있습니다. 바이트 시퀀스를'result'로 모아서 시퀀스가 ​​완전히 읽힌 후 with와 함께 쓰여진 인코딩으로 변환하십시오. –

+0

나는 IBM에서 고급 기능 프레젠테이션을 해석하려고하는 파일 형식에 대한 연구를 수행했습니다. 길이 레코드 길이를 지정하는 2 바이트 필드 (5A 제어 문자 제외). 식별자 (ID) 구조화 된 필드의 유형을 지정하는 3 바이트 필드입니다. 플래그 Y이트 데이터 필드에 대한 정보를 지정하는 1Y이트 필드. 순서 번호 레코드를 식별하는 2Y이트 필드. 제어 및 데이터 텍스트 제어 코드, 객체 이름 또는 이미지 또는 페이지 세그먼트 배치를위한 좌표. 제어 정보 다음에는 데이터가옵니다. – Faqundo