Я застрял в цикле при обработке шестнадцатеричных данных из файла - PullRequest
0 голосов
/ 10 января 2019

Я пытаюсь получить файл, содержащий шестнадцатеричные значения, для преобразования в двоичный файл, но программа чтения файлов не читает следующие строки и застревает в цикле.


Вот как выглядит шестнадцатеричный файл:

3c011001
34300000
8e080000

Ниже приведен код, который я использую для генерации вывода:

 using System;
 using System.IO;

class MaddinClass 
{
    static void Main (string[] args) 
    {
         StreamReader sr = new StreamReader("MachineCode.txt");
         string binary_from_file = sr.ReadLine();

         while(!sr.EndOfStream)
         {
             uint binary = Convert.ToUInt32(binary_from_file, 16);
             Console.WriteLine(binary);
         }
     }
}

Я получаю результат цикла следующим образом:

1006702593
1006702593
1006702593

Я ожидаю, что он переместится на следующую строку и сохранит новый двоичный результат, вместо этого он просто печатает одно и то же значение многократно.

1 Ответ

0 голосов
/ 10 января 2019

С вашей текущей настройкой вы на самом деле не читаете файл до конца. Вы создали свой StreamReader объект и прочитали первую строку из файла. Затем вы попадаете в бесконечный цикл из-за:

while (!sr.EndOfStream)

Поскольку тело цикла не читает никакой информации из потока, вы непрерывно обрабатываете одну и ту же строку из файла, который вы сохранили до входа в цикл, поэтому вы постоянно видите 1006702593. Если вы преобразуете это значение обратно в шестнадцатеричное из десятичного числа, вы увидите, что оно соответствует вашему первому шестнадцатеричному вводу 3c011001.

uint binary = Convert.ToUInt32(binary_from_file, 16);

В соответствии с инструкцией Microsoft вам следует назначать каждую строку в условии условия вашего цикла while. Это позволит вам обрабатывать каждую строку по отдельности до конца файла, где ReadLine должен возвращать null, поскольку читать нечего.

Этот пример читает содержимое текстового файла, по одной строке за раз, в строку, используя метод ReadLine класса StreamReader. Каждая строка текста сохраняется в строку line и отображается на экран.

Я также хотел бы отметить, что строка выше не преобразуется в двоичную, а скорее в целое число без знака (отсюда и ваше значение 1006702593 вместо 111100000000010001000000000001); вам нужно преобразовать результат этого в строку с представлением базы 2, и если у вас нет веской причины использовать целые числа без знака, я бы вместо этого использовал целые числа со знаком:

string binary = Convert.ToString(Convert.ToInt32(binary_from_file, 16), 2);

Ниже приведена отредактированная копия вставки по ссылке выше для удовлетворения ваших потребностей:

string line;
using (StreamReader file = new StreamReader(@"c:\test.txt"))
    while((line = file.ReadLine()) != null)
        Console.WriteLine(Convert.ToString(Convert.ToInt32(line, 16), 2));

Console.ReadLine();

В двух словах, приведенный выше код соответствует следующему пути выполнения:

  • Создать переменную для хранения каждой строки.
  • Создайте новый StreamReader объект, направленный на ваш файл.
  • Читать каждую строку из файла.
    • Вывести эту строку в двоичном представлении.
  • Закрыть поток.
  • Утилизация потока.
  • Приостановите Console, чтобы предотвратить его автоматическое закрытие.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...