Преобразование из байта [] в строку

2

У меня есть следующий код:

using (BinaryReader br = new BinaryReader(
       File.Open(FILE_PATH, FileMode.Open, FileAccess.ReadWrite)))
{
    int pos = 0;
    int length = (int) br.BaseStream.Length;

    while (pos < length)
    {
        b[pos] = br.ReadByte();
        pos++;
    }

    pos = 0;
    while (pos < length)
    {
        Console.WriteLine(Convert.ToString(b[pos]));
        pos++;
    }
}

FILE_PATH является строкой const, которая содержит путь к считываемому двоичному файлу. Бинарный файл представляет собой смесь целых чисел и символов. Целые числа - 1 байт каждый, и каждый символ записывается в файл как 2 байта.

Например, файл имеет следующие данные:

ЯЕЛЛО, КАК ВЫ ВЫБРАТЬ ВАС, ВЫ ИЩЕТЕ БОЛЬШЕ//и т.д.

Обратите внимание: каждое целое число связано с строкой символов, следующих за ней. Таким образом, 1 связан с "HELLO, КАК ВЫ", и 45 с "ВЫ ИЩЕТЕ БОЛЬШИЕ" и т.д.

Теперь бинарный файл написан (я не знаю, почему, но я должен жить с этим), так что "1" будет принимать только 1 байт, а "H" (и другие символы) - по 2 байта.

Итак, вот что на самом деле содержит файл:

0100480045..и т.д. Heres разбивка:

01 - первый байт для целого числа 1 0048 - это 2 байта для "H" (H - 48 в Hex) 0045 - 2 байта для 'E' (E = 0x45)

и т.д.. Я хочу, чтобы моя консоль печатала человеческий читаемый формат из этого файла: я хочу, чтобы он печатал "1 ПРИВЕТ, КАК ВЫ", а затем "45 ВЫ ИЩИТЕ ВЕЛИКОГО" и т.д....

Это то, что я делаю правильно? Есть ли более простой/эффективный способ?  Моя строка Console.WriteLine(Convert.ToString(b [pos])); делает только распечатку целочисленного значения, а не фактический символ, который я хочу. Это нормально для целых чисел в файле, но тогда как я читаю символы?

Любая помощь будет высоко оценена. Благодаря

  • 0
    язык?
  • 0
    Я удалил свой ответ - что думал человек, который определился с этим форматом? : Поражали:
Показать ещё 3 комментария
Теги:
binaryreader

3 ответа

8
Лучший ответ

Я думаю, что вы ищете Encoding.GetString.

Поскольку ваши строковые данные состоят из 2 байтовых символов, как вы можете получить свою строку:

for (int i = 0; i < b.Length; i++)
{
  byte curByte = b[i];

  // Assuming that the first byte of a 2-byte character sequence will be 0
  if (curByte != 0)
  { 
    // This is a 1 byte number
    Console.WriteLine(Convert.ToString(curByte));
  }
  else
  { 
    // This is a 2 byte character. Print it out.
    Console.WriteLine(Encoding.Unicode.GetString(b, i, 2));

    // We consumed the next character as well, no need to deal with it
    //  in the next round of the loop.
    i++;
  }
}
  • 0
    Вам нужно будет прочитать первый байт «id» отдельно, а затем перевести остальные байты, используя правильную кодировку.
  • 0
    О, я пропустил этот вопрос. Я отредактирую свой ответ.
Показать ещё 5 комментариев
1

Вы можете использовать String System.Text.UnicodeEncoding.GetString(), который принимает массив byte [] и создает строку. Я нашел эту ссылку очень полезной

  • 0
    Вы действительно должны добавить резюме, чтобы ваш ответ мог стоять сам по себе. Это не мое отрицательное мнение, но я, конечно, могу понять, почему кто-то подумал, что это бесполезно.
0
using (BinaryReader br = new BinaryReader(File.Open(FILE_PATH, FileMode.Open, FileAccess.ReadWrite)))
{    
   int length = (int)br.BaseStream.Length;    

   byte[] buffer = new byte[length * 2];
   int bufferPosition = 0;

   while (pos < length)    
   {        
       byte b = br.ReadByte();        
       if(b < 10)
       {
          buffer[bufferPosition] = 0;
          buffer[bufferPosition + 1] = b + 0x30;
          pos++;
       }
       else
       {
          buffer[bufferPosition] = b;
          buffer[bufferPosition + 1] = br.ReadByte();
          pos += 2;
       }
       bufferPosition += 2;       
   }    

   Console.WriteLine(System.Text.Encoding.Unicode.GetString(buffer, 0, bufferPosition));

}

  • 1
    Я получаю следующие ошибки компилятора, когда я пытаюсь использовать ваш код в буфере строк [bufferPosition + 1] = b + 0x30; : ошибка CS0266: невозможно неявно преобразовать тип 'int' в 'byte'. Существует явное преобразование (вам не хватает приведения?)
  • 0
    Также я проверил значение переменной длины. Это включает в себя количество нулей. Поэтому я не думаю, что изначально нужно умножать его на 2, как вы это сделали.
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню