🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

Article View: es.comp.lenguajes.java
Article #28251

Q: Lectura de fiechero binario

#28251
From: Rafael Garcia Leiva
Date: Mon, 11 May 1998 00:00
95 lines
2923 bytes
Parece que el anterior llego mal. Asi que reenvio la pregunta :-)

	Hola!

	Tengo un fichero binario, que puedo leerlo perfectamente desde C,
pero con java tengo problemas (trabajo con Solaris)
	El fuente en C es el siguiente:

main() {
    FILE *fp;
    int lsb, msb;
    int agno;

    fp = fopen( "97280a14.hrp", "rb" );

    lsb = (int)getc(fp);
    msb = (int)getc(fp);
    agno = msb * 256 + lsb;
    (void)printf( "lsb: %d\n", lsb );
    (void)printf( "msb: %d\n", msb );
    (void)printf( "A�o: %d\n", agno );
 
    (void)fclose( fp );
}

que da el siguiente resultado:

lsb: 205
msb: 7
A�o: 1997


Utilizando el programa java:

int lsb, msb;
int a�o;

InputStream fich = new FileInputStream( "97280a14.hrp" ); 
DataInputStream in = new DataInputStream( fich );

lsb = (int)in.readByte();
msb = (int)in.readByte();
a�o = ( (msb * 256) + lsb );
System.out.println( "lsb: " + lsb );
System.out.println( "msb: " + msb );
System.out.println( "A�o: " + a�o );

obtengo como resultado:

lsb: -51
msb: 7
A�o: 1741

que no es lo que quiero. Supongo que el problema esta en que readByte supone
bytes con sigo, y yo los necesito unsigned. Tampoco funciona el siguiente
codigo

byte b1, b2;
int a�o;

b1 = in.readByte();
b2 = in.readByte();
a�o = ( ( b2 << 8 ) | b1 );
System.out.println( "lsb: " + b1 );
System.out.println( "msb: " + b2 );
System.out.println( "A�o: " + a�o );

que da como resultado:

lsb: -51
msb: 7
A�o: -51

se ve que antes de trabajar a nivel de bits convierte los bytes a enteros.
Utilizando el readShort() tampoco funciona (me da A�o: -13049),
y al final lo unico que he conseguido que funcione es:

b1 = in.readByte();
b2 = in.readByte();
a�o = (int)( ( (0x000000FF & b2) << 8) | ( 0x000000FF & b1 ) );

que me parece tremendamente engorroso. No hay una forma mas facil de
hacerlo.


				Un saludo, y gracias por adelantado.


 ----------------------------------- ----------------------------------------
|       Rafael Garcia Leiva         |  Servicio de Informacion de Territorio |
|         cc1galer@uco.es           |       E.T.S de Agronomos y Montes      |
|      Tlf: 34  (9)57 218921        |      Universidad de Cordoba (Spain)    | 
|      Fax: 34  (9)57 218563        |     http://www.uco.es/servicios/scit   |
 ----------------------------------- ----------------------------------------
Technical Details
Message-ID: <6j6l7k$qvb$2@erika.cica.es>
Path: arc1-ca.pugleaf.net!unknown!not-for-mail

Show Full Headers
Complete Article Headers
X-Google-Language: SPANISH,ASCII
X-Google-Thread: 1116f3,755beee34340d88a
X-Google-Attributes: gid1116f3,public
From: cc1galer@uco.es (Rafael Garcia Leiva)
Subject: Q: Lectura de fiechero binario
Date: 1998/05/11
Message-ID: <6j6l7k$qvb$2@erika.cica.es>
X-Deja-AN: 352205214
Content-Transfer-Encoding: 8bit
Content-Type: text/plain; charset=iso-8859-1
Organization: Centro Informatico Cientifico de Andalucia
Mime-Version: 1.0
Newsgroups: es.comp.lenguajes.java