c# - 我在处理文件中的十六进制数据时陷入循环
问题描述
我正在尝试接收一个包含十六进制值的文件以转换为二进制文件,但文件阅读器没有在下一行中读取,它卡在一个循环中。
这是十六进制文件的样子:
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
我希望它移动到下一行并存储一个新的二进制结果,而不是重复打印相同的值。
解决方案
使用您当前的设置,您并没有真正将文件读到最后。您已经创建了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
以防止它自动关闭。
推荐阅读
- java - 它不适合添加 import java.util.Scanner
- python - 更新重复项的更快方法
- gitlab - GitLab CI 管道失败您必须使用 Bundler 2 或更高版本与此锁定文件
- php - 当我尝试更新信息时,会显示 [Route: admin.update_student] [URI: admin/updatestudent/{id}] 的 Missing required parameters
- hadoop - HADOOP - 权限被拒绝执行 ./start-yarn.sh Ubuntu 18
- c# - 上次更新后的 Blazor 客户端自定义身份验证问题
- python - 如何使用带有自定义 html 模板而不是可浏览 API 的 django rest-auth 视图
- node.js - 从 firebase 读取数据时出现 Http2CallStream.call.on 错误
- .net - 以下使用 ASP.NET Core 和 MongoDB 创建 Web API:MvcJsonOptions 问题与 UseMemberCasing() 定义
- c++ - 使用 istream_iterators 构造向量比使用 string / std::atof 的 while 循环慢,为什么?