首页 > 解决方案 > 我在处理文件中的十六进制数据时陷入循环

问题描述

我正在尝试接收一个包含十六进制值的文件以转换为二进制文件,但文件阅读器没有在下一行中读取,它卡在一个循环中。


这是十六进制文件的样子:

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

我希望它移动到下一行并存储一个新的二进制结果,而不是重复打印相同的值。

标签: c#binary

解决方案


使用您当前的设置,您并没有真正将文件读到最后。您已经创建了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以防止它自动关闭。

推荐阅读