我正在尝试获取一个包含十六进制值的文件,以将其转换为二进制文件,但文件读取器未在下一行读取内容,并且卡在了循环中。
以下是十六进制文件的外观:
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
我希望它移至下一行并存储新的二进制结果,而只是重复打印相同的值。
答案 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
,以防止其自动关闭。