使用 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 中创建的二进制文件
在 c# / ReadAsync 中读取二进制数据而不是读取计数中指定的所有内容