2011-04-10 69 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