2010-03-03 3 views
3

У меня есть программа для записи текстового файла с использованием интерфейса stdio. Он заменяет 4 MSB на 4 LSB, за исключением символов CR и/или LF.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, но это не сработало. Я также использовал BinaryReader, созданный с помощью 'sr' StreamReader, но ничего хорошего не произошло.

 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

Got it.

Проблема является строительство BinaryReader:

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

Я думаю, что это построить BinaryReader основанный на StreaReader, который «переводить» символы, поступающие из файла.

Используя этот код на самом деле работает хорошо:

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

Интересно, если это возможно, чтобы прочитать эти виды данных с чтением текста потока построчно, так как линия окончания сохраняются во время фазы «кодирования» ,

+0

строк-концов не имеет смысла при обработке файлов как «немых» байтов, я думаю, что вам не нужно поддерживать «чтение строки» в BinaryReader. Но это действительно проблема для вас? Если вы все еще хотите «декодировать» весь ваш файл, это не имеет смысла делать это по очереди. – jishi

0

Я думаю, вы должны использовать BinaryReader и ReadBytes(), а затем использовать Encoding.ASCII.GetString() в bytesequence после того, как вы поменяли биты.

В вашем примере вы, кажется, читаете файл как ascii (что означает, что вы преобразовываете байты в внутренний двоичный код .NET, когда читаете, говоря, что это ascii), а затем снова преобразуйте его обратно в байты, так как ascii -bytes.

Это не нужно для вас.

+0

Даже с BinaryReader не удалось получить правильный результат. :((См. Edit) – Luca

Смежные вопросы