使用 IO 在 C# 中读取十六进制

Posted

技术标签:

【中文标题】使用 IO 在 C# 中读取十六进制【英文标题】:Read hex in C# using IO 【发布时间】:2011-08-02 12:23:57 【问题描述】:

我是从 Java 迁移到 C# 的新手。我正在尝试使用 HEX 中的 IO 读取文件。当我读取第一个字节时,我没有得到我在十六进制编辑器中看到的内容。

我正在使用

StreamReader reader = new StreamReader(fileDirectory);
int hexIn;
String hex;

for (int i = 0; (hexIn = reader.Read()) != -1; i++)
    hex = Convert.ToString(hexIn, 16);

我在 Java 中使用过

FileInputStream fis = new FileInputStream(file);
long length = file.length();

int hexIn;
String hex = "";

for(int i = 0; (hexIn = fis.read()) != -1; i++)

    String s = Integer.toHexString(hexIn);
    if(s.length() < 2)
        s = "0" + Integer.toHexString(hexIn);
    

我希望这是有道理的。任何帮助都会很感激:)

谢谢。

【问题讨论】:

与您的预期相比,您得到了什么? 你好,我得到的是FFFD而不是D0CF,看来读入的FFFD是D0CF的ascii,现在搞糊涂了哈哈 【参考方案1】:

不要使用StreamReader——这仅适用于特定编码(默认 UTF8)的字符。请改用FileStream 类:

FileStream fs = new FileStream(fileDirectory, FileMode.Open);
int hexIn;
String hex;

for (int i = 0; (hexIn = fs.ReadByte()) != -1; i++)
    hex = string.Format("0:X2", hexIn);

【讨论】:

谢谢你,马克,我昨天在阅读并明白了我必须使用 Stream 阅读器,尽管我在 Java 方面的经验另有说明。但是感谢测试和工作,任何其他阅读本文的人都不要忘记放... FileStream fs = new FileStream(fileDirectory, FileMode.Open);因为如果你不这样做,它就会大惊小怪:) 也只是为了说明其他人使用这个你需要使用 hexIn = fs.ReadByte();上面所以它会读取下一个字节,只是让我困惑了一分钟哈哈【参考方案2】:

您需要这样的C# 代码来实现与您的Java 代码相同的结果:

hex = hexIn.ToString("X").PadLeft(2, '0');

Convert.ToString 也可以,但 IMO 使用整数的原生 ToString 是更好的做法。 无论如何,您错过了PadLeft 确实导致 15 为“f”而不是 0F 的部分。

【讨论】:

你如何读取整数?根据文档, StreamReader.Read() 方法返回一个 ASCII 值。这很可能是他没有得到与他的十六进制编辑器相同的结果的原因。 @Jack 每个字符都由 ASCII 值表示,HEX 只是不同的基数,但完全相同。 ASCII 码 15 的字符可以用十六进制表示为0F,这就是十六进制编辑器所显示的内容,但在幕后它是相同的。 :-) @Shadow Wizard: 哎呀...我以为他只是想读取整数:)。抱歉,删除答案:P。 嗨,感谢您这么快的回复,即使我使用 hex = hexIn.ToString("X").PadLeft(2, '0');前两个字节是 FFFD 而不是 D0CF,如十六进制编辑器中所示,我确定我只是在做一些愚蠢的事情! 感谢您的帮助,Shadow,感谢 Mark ^^,感谢 Jack 的帮助,我成功了 :)

以上是关于使用 IO 在 C# 中读取十六进制的主要内容,如果未能解决你的问题,请参考以下文章

在 C# 中使用 QDataStream 读取在 QT 中创建的二进制文件

Java中使用字节流类读取二进制文件

文本IO 二进制IO

在 c# / ReadAsync 中读取二进制数据而不是读取计数中指定的所有内容

将二进制文件读取(fread)代码从 MATLAB 转换为 C#

C#读写二进制文件