2011-04-10 12 views
9

HI, Sono nuovo di C# in movimento da Java. Cercando di leggere in un file usando IO in HEX. Quando leggo il primo byte non riesco a ottenere ciò che vedo nel mio editor esadecimale.Leggi hex in C# utilizzando IO

sto usando

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

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

in Java ho usato ...

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

Spero che questo ha un senso. Qualsiasi aiuto sarebbe più apperciated :)

Grazie

+1

Cosa si ottiene rispetto a ciò che si aspetta? –

+0

Ciao, sto ricevendo FFFD non D0CF, sembra che l'FFFD che viene letto sia l'ascii di D0CF, confuso ora ha ha – Pete

risposta

11

Non utilizzare un StreamReader, ovvero solo per i caratteri in una determinata codifica (impostazione predefinita UTF8). Utilizzare invece una classe 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

Grazie Mark, stavo leggendo ieri e ho capito che dovevo usare il lettore Stream anche se la mia esperienza in Java diceva il contrario. Ma grazie testato e funzionante, chiunque altro stia leggendo questo, non dimentica di mettere ... FileStream fs = new FileStream (fileDirectory, FileMode.Open); come si fa a calci un polverone se non lo fai :) – Pete

+0

anche solo per la nota in caso altre persone usano questo è necessario utilizzare hexIn = fs.ReadByte(); sopra così leggerà il prossimo byte in, mi ha appena confuso di un minuto ha ha – Pete

+0

l'ho risolto; Grazie. –

0

È necessario tale codice C# per ottenere gli stessi risultati come il codice Java:

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

Il Convert.ToString funziona anche, ma IMO utilizzando il nativo ToString del numero intero è una pratica migliore.
Ad ogni modo, mancava la parte PadLeft che in effetti causava 15 essere "f" invece di 0F.

+0

Come si legge in un numero intero? Secondo la documentazione, il metodo StreamReader.Read() restituisce un valore ASCII. Questo è probabilmente il motivo per cui non ottiene gli stessi risultati del suo editor esadecimale. – JackMc

+0

@Jack ogni carattere è rappresentato dal valore ASCII, HEX è solo una base diversa ma è esattamente la stessa cosa. Il carattere con il codice ASCII 15 può essere rappresentato in HEX come '0F' e questo è ciò che gli editor esadecimali stanno mostrando, ma dietro il cofano è la stessa cosa. :-) –

+0

@Shadow Wizard: Oops ... Ho pensato che stesse cercando di leggere solo i numeri interi :). Siamo spiacenti, cancellazione risposta: P. – JackMc