2010-03-03 11 views
3

나는 stdio 인터페이스를 사용하여 텍스트 파일을 저장하는 프로그램을 작성했습니다. CRB 및/또는 LF 문자를 제외하고 4 MSB를 4 LSB로 바꿉니다.FileStream 및 인코딩

C# 프로그램을 사용하여이 스트림을 "디코딩"하려고하는데 원본 바이트를 가져올 수 없습니다.

 StringBuilder sb = new StringBuilder(); 
     StreamReader sr = new StreamReader("XXX.dat", Encoding.ASCII); 
     string sLine; 

     while ((sLine = sr.ReadLine()) != null) { 
      string s = ""; 
      byte[] bytes = Encoding.ASCII.GetBytes(sLine); 

      for (int i = 0; i < sLine.Length; i++) { 
       byte c = bytes[i]; 
       byte lb = (byte)((c & 0x0F) << 4), hb = (byte)((c & 0xF0) >> 4); 
       byte ascii = (byte)((lb) | (hb)); 

       s += Encoding.ASCII.GetString(new byte[] { ascii }); 
      } 
      sb.AppendLine(s); 
     } 
     sr.Close(); 

     return (sb); 

인코딩을 UTF8로 변경하려고했지만 작동하지 않았습니다. 나는 또한 'sr'StreamReader를 사용하여 만든 BinaryReader를 사용했지만 좋은 것은 없습니다.

 StringBuilder sb = new StringBuilder(); 
     StreamReader sr = new StreamReader("XXX.shb", Encoding.ASCII); 
     BinaryReader br = new BinaryReader(sr.BaseStream); 
     string sLine; 
     string s = ""; 

     while (sr.EndOfStream == false) { 
      byte[] buffer = br.ReadBytes(1); 
      byte c = buffer[0]; 
      byte lb = (byte)((c & 0x0F) << 4), hb = (byte)((c & 0xF0) >> 4); 
      byte ascii = (byte)((lb) | (hb)); 

      s += Encoding.ASCII.GetString(new byte[] { ascii }); 
     } 
     sr.Close(); 

     return (sb); 

파일이 0xF2 0xF2 ...로 시작하면 예상 값을 제외한 모든 것을 읽습니다. 오류는 어디에 있습니까? (예 : 0xF6 0xF6).

사실이 C 코드는 작업을 수행합니다

  ... 
while (fgets(line, 2048, bfd) != NULL) { 
    int cLen = strlen(xxx), lLen = strlen(line), i; 

    // Decode line 
    for (i = 0; i < lLen-1; i++) { 
     unsigned char c = (unsigned char)line[i]; 
     line[i] = ((c & 0xF0) >> 4) | ((c & 0x0F) << 4); 
    } 

    xxx = realloc(xxx , cLen + lLen + 2); 
    xxx = strcat(xxx , line); 
    xxx = strcat(xxx , "\n"); 
} 
fclose(bfd); 

C# 코드에서 어떤 문제가 있습니까?

답변

2

알 수 있습니다.

StreamReader sr = new StreamReader("XXX.shb", Encoding.ASCII); 
BinaryReader br = new BinaryReader(sr.BaseStream); 

나는이 StreaReader 파일에서 오는 "번역"캐릭터를 기반으로 BinaryReader를을 만들 생각 :

문제는 BinaryReader를 건설한다.

이 코드를 사용하여 실제로 잘 작동 :

FileInfo fi = new FileInfo("XXX.shb"); 
BinaryReader br = new BinaryReader(fi.OpenRead()); 

는 라인별로 텍스트 스트림 리더 라인과 데이터의 그런 종류를 읽을 수있는 경우 행 끝은 "인코딩"단계에서 유지되기 때문에 내가 궁금해 .

+0

라인 - 엔딩은 "벙어리"바이트로 파일을 처리 할 때 이해가 필요하지 않습니다, 나는 그 때문에 BinaryReader에서 "라인 읽기"를 지원할 필요가 없다고 생각합니다. 당신에게 문제가 되는가? 당신이 여전히 전체 파일을 "해독"하고 싶다면, 그것을 한 줄씩하는 것은별로 의미가 없다. – jishi

0

BinaryReader 및 ReadBytes()를 사용해야하며 비트를 바꾼 후에는 Byteesequence에만 Encoding.ASCII.GetString()을 사용해야합니다.

예를 들어 파일을 ascii로 읽는 것처럼 보입니다. 즉, ascii로 읽으면 바이트를 .NET 내부 이중 바이트 코드로 변환 한 다음 ASCII로 다시 바이트로 변환합니다. 바이트.

귀하에게는 불필요합니다.

+0

BinaryReader를 사용해도 올바른 결과를 얻을 수 없습니다. :((편집보기) – Luca