2011-04-10 75 views
9

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

我使用

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); 
     } 

我希望这是有道理的。任何帮助将是最apperciated :)

感谢

+1

你想说什么比你期待什么呢? – 2011-04-10 14:49:53

+0

嗨,我得到的FFFD不是D0CF,看起来FFFD即时读取的是D0CF的ascii,现在越来越困惑了哈哈 – Pete 2011-04-10 15:12:47

回答

11

请勿使用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); 
} 
+0

谢谢马克,我昨天在读,得到它在我的脑海中,我不得不使用Stream阅读器,虽然我在Java中的经验告诉我,否则。但感谢测试和工作,任何其他读这不会忘记把... FileStream fs =新的FileStream(fileDirectory,FileMode.Open);因为它踢了一个大惊小怪,如果你没有:) – Pete 2011-04-10 15:20:17

+0

也只是为了说明incase其他人使用它,你需要使用hexIn = fs.ReadByte();所以它会读下一个字节,只是让我困惑了一分钟哈哈 – Pete 2011-04-10 15:46:18

+0

我修好了;谢谢。 – 2011-04-10 16:08:36

0

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

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

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

+0

虽然你如何读取整数?根据文档,StreamReader.Read()方法返回一个ASCII值。这很可能是他为什么没有得到与他十六进制编辑相同的结果。 – JackMc 2011-04-10 14:50:28

+0

@Jack每个字符都由ASCII值表示,HEX只是不同的基础,但它完全一样。 ASCII代码为15的字符可以用十六进制表示为'0F',这就是十六进制编辑器显示的内容,但引擎盖后面是同样的东西。 :-) – 2011-04-10 14:55:05

+0

@Shadow Wizard:哎呀......我以为他只是试着读整数:)。对不起,删除答案:P。 – JackMc 2011-04-10 14:59:19