2011-04-10 19 views
9

HI, Soy nuevo en C# al pasar de Java. Intentando leer en un archivo usando IO en HEX. Cuando leo el primer byte no obtengo lo que veo en mi editor Hex.Lea el hexágono en C# usando IO

estoy usando

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

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

en Java utilicé ...

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

espero que esto tenga sentido. Cualquier ayuda sería más apperciated :)

Gracias

+1

¿Qué está recibiendo en comparación con lo que está esperando? –

+0

Hola, estoy recibiendo FFFD no D0CF, parece que el FFFD que se lee es el ascii de D0CF, confundido ahora, ja, ja – Pete

Respuesta

11

No use un StreamReader -que es solo para caracteres en una cierta codificación (UTF8 por defecto). Use una clase FileStream en su lugar:

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

Gracias Mark, estaba leyendo ayer y entendí en mi cabeza que tenía que usar el lector Stream aunque mi experiencia en Java decía lo contrario. Pero gracias a las pruebas y al trabajo, cualquiera que lea esto, no olvide poner ... FileStream fs = new FileStream (fileDirectory, FileMode.Open); ya que levanta un escándalo si no lo haces :) – Pete

+0

también solo para la nota en caso de que otras personas lo usen, necesitas usar hexIn = fs.ReadByte(); arriba para que lea el siguiente byte, solo me confundió por un minuto, ja, ja – Pete

+0

Lo arreglé; Gracias. –

0

Es necesario dicho código C# para lograr los mismos resultados que el código Java:

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

El Convert.ToString también funciona, pero la OMI utilizando el nativo ToString del entero es una mejor práctica.
De todos modos, faltaba la parte PadLeft que de hecho causaba que 15 fuera 'f' en lugar de 0F.

+0

¿Cómo se lee en un número entero? De acuerdo con la documentación, el método StreamReader.Read() devuelve un valor ASCII. Es más probable por qué no está obteniendo los mismos resultados que su editor hexadecimal. – JackMc

+0

@Jack cada personaje está representado por el valor ASCII, HEX es simplemente una base diferente, pero es exactamente lo mismo. El carácter con código ASCII 15 se puede representar en HEX como '0F' y eso es lo que muestran los editores hexadecimales, pero detrás del capó es lo mismo. :-) –

+0

@Shadow Wizard: Ups ... pensé que estaba tratando de leer en números enteros :). Lo siento, borrar la respuesta: P. – JackMc