处理文件中的十六进制数据时,我陷入了循环

时间:2019-01-10 17:41:39

标签: c# binary

我正在尝试获取一个包含十六进制值的文件,以将其转换为二进制文件,但文件读取器未在下一行读取内容,并且卡在了循环中。


以下是十六进制文件的外观:

  

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 :(得分:1)

使用当前设置,您并没有真正读完文件。您已经创建了StreamReader对象,并从文件中读取了第一行。然后,由于以下原因,您最终陷入无尽循环:

while (!sr.EndOfStream)

由于您的循环主体不会从流中读取任何信息,因此您要在进入循环之前从存储的文件中连续处理同一行,这就是为什么您始终看到1006702593的原因。如果您将该值从十进制转换回十六进制,则会看到它与3c011001的第一个十六进制输入匹配。

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

对于每个Microsoft instruction,您应该在while循环的condition clause中分配每一行。这样一来,您就可以逐行处理每一行,直到文件末尾为止,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,以防止其自动关闭。