Hola, a ver si alguien me puede echar una manita por favor:
Tengo un archivo binario que quiero leer. El archivo contiene bloques de 40 bytes que se repiten hasta el final.
Por cada bloque tengo 5 datos de 8 bytes cada uno.
Es decir, tengo:
[dato1, dato2, dato3, dato4, dato5] --> 40 bytes, 8bytes cada uno, y vuelta a empezar con otros 40, etc ...
El primero es un Long que representa una fecha.
Los otros 4 son Doubles.
Bueno, pues necesito leerlos y no puedo.
El problema viene (creo) porque fueron creados en una aplicación Java. En Java, un byte es un sbyte de C#, por tanto lo que tengo es un Stream de sbytes. Lo único que se me ocurre hacer es crear un BinaryReader, y leer todos los sbytes en un Array. A partir de ahí no me sale bien.
Una muestra:
BinaryReader br = new BinaryReader(new FileStream(pathArchivo, FileMode.Open, FileAccess.Read));
// Leo los primeros 40 sBytes
sbyte[] prueba = new sbyte[40];
for (int i = 0; i < 40; i++) {
sbyte sb = br.ReadSByte();
prueba[i] = sb;
}
// Intento recuperar los datos
Recupera(prueba, 0);
// -----------------------------------------------
public void Recupera(sbyte[] arr, int offset) {
_time = getLong(arr, offset);
_d1= getDouble(arr, offset+ 1 * 8);
_d2= getDouble(arr, offset+ 2 * 8);
_d3= getDouble(arr, offset+ 3 * 8);
_d4= getDouble(arr, offset+ 4 * 8);
}
// -----------------------------------------------
private long getLong(sbyte[] arr, int offset) {
return ((arr[offset+ 7] & 0xFFL) << 0) +
((arr[offset+ 6] & 0xFFL) << 8) +
((arr[offset+ 5] & 0xFFL) << 16) +
((arr[offset+ 4] & 0xFFL) << 24) +
((arr[offset+ 3] & 0xFFL) << 32) +
((arr[offset+ 2] & 0xFFL) << 40) +
((arr[offset+ 1] & 0xFFL) << 48) +
(((long)b[offset+ 0]) << 56);
}
// -----------------------------------------------
private double getDouble(sbyte[] arr, int offset) {
long j = ((arr[offset+ 7] & 0xFFL) << 0) +
((arr[offset+ 6] & 0xFFL) << 8) +
((arr[offset+ 5] & 0xFFL) << 16) +
((arr[offset+ 4] & 0xFFL) << 24) +
((arr[offset+ 3] & 0xFFL) << 32) +
((arr[offset+ 2] & 0xFFL) << 40) +
((arr[offset+ 1] & 0xFFL) << 48) +
(((long)b[offset+ 0]) << 56);
return (double)(j);
}
// -----------------------------------------------
El caso es que la fecha me la recupera bien (obtengo un long que traslado a una fecha) pero con los doubles no hay manera.
¿ alguna ayuda o sugerencia ?
gracias