• Domingo 22 de Diciembre de 2024, 04:13

Autor Tema:  Problema con archivo binario  (Leído 1354 veces)

E.Baley

  • Miembro activo
  • **
  • Mensajes: 44
    • Ver Perfil
Problema con archivo binario
« en: Viernes 23 de Enero de 2009, 18:45 »
0
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:

Código: Text
  1.  
  2.     BinaryReader br = new BinaryReader(new FileStream(pathArchivo, FileMode.Open, FileAccess.Read));
  3.  
  4.     // Leo los primeros 40 sBytes
  5.     sbyte[] prueba = new sbyte[40];
  6.     for (int i = 0; i < 40; i++) {
  7.         sbyte sb = br.ReadSByte();
  8.         prueba[i] = sb;
  9.     }
  10.     // Intento recuperar los datos
  11.     Recupera(prueba, 0);
  12.    
  13.     // -----------------------------------------------
  14.     public void Recupera(sbyte[] arr, int offset) {
  15.  
  16.         _time = getLong(arr, offset);
  17.         _d1= getDouble(arr, offset+ 1 * 8);
  18.         _d2= getDouble(arr, offset+ 2 * 8);
  19.         _d3= getDouble(arr, offset+ 3 * 8);
  20.         _d4= getDouble(arr, offset+ 4 * 8);
  21.     }
  22.     // -----------------------------------------------
  23.     private long getLong(sbyte[] arr, int offset) {
  24.  
  25.         return ((arr[offset+ 7] & 0xFFL) << 0) +
  26.                   ((arr[offset+ 6] & 0xFFL) << 8) +
  27.                   ((arr[offset+ 5] & 0xFFL) << 16) +
  28.                   ((arr[offset+ 4] & 0xFFL) << 24) +
  29.                   ((arr[offset+ 3] & 0xFFL) << 32) +
  30.                   ((arr[offset+ 2] & 0xFFL) << 40) +
  31.                   ((arr[offset+ 1] & 0xFFL) << 48) +
  32.                   (((long)b[offset+ 0]) << 56);
  33.     }
  34.     // -----------------------------------------------
  35.     private double getDouble(sbyte[] arr, int offset) {
  36.  
  37.         long j = ((arr[offset+ 7] & 0xFFL) << 0) +
  38.                     ((arr[offset+ 6] & 0xFFL) << 8) +
  39.                     ((arr[offset+ 5] & 0xFFL) << 16) +
  40.                     ((arr[offset+ 4] & 0xFFL) << 24) +
  41.                     ((arr[offset+ 3] & 0xFFL) << 32) +
  42.                     ((arr[offset+ 2] & 0xFFL) << 40) +
  43.                     ((arr[offset+ 1] & 0xFFL) << 48) +
  44.                     (((long)b[offset+ 0]) << 56);
  45.  
  46.         return (double)(j);
  47.     }
  48.     // -----------------------------------------------
  49.  
  50.  
  51.  

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

E.Baley

  • Miembro activo
  • **
  • Mensajes: 44
    • Ver Perfil
Re: Problema con archivo binario
« Respuesta #1 en: Viernes 23 de Enero de 2009, 19:55 »
0
Lo encontré
En la última línea de GetDouble debí poner return System.BitConverter.Int64BitsToDouble(j);
perdón por la molestia