Ayuda con codigo delphis

Yusnier Acosta Fdez
28 de Enero del 2011
Comenzare por el principio… tengo un programa hecho en delfis que crea un fichero binario con extensión “.oam”. Mi tarea consiste en importar ese fichero, leerlo y pasar toda esa información a una base de datos para utilizarla en mi sistema web.
Yo cuento con todo el código delfis del programa que crea el fichero. Necesito que me ayuden a entender cómo funciona para poder pasarlo a java. Pongo algunos trozos de códigos de lo que he entendido yo. Comentarles que se trata de un software meteorológico, por lo que se manejan lecturas diarias de algunos instrumentos.
Este es el código que escribe el fichero:
function Save_Data(dat_path: string): boolean;
var
F: file;
begin
try
AssignFile(F, dat_path);
Rewrite(F, 1);
BlockWrite(F, measur, SizeOf(measur));
BlockWrite(F, fix, SizeOf(fix));
BlockWrite(F, dat_a, SizeOf(dat_a));
CloseFile(F);
except
on EInOutError do
begin
case IOResult of
2: MessageDlg('El fichero de correcciones de datos no existe.', mtError, [mbOk], 0);
3: MessageDlg('No se encuentra el directorio del fichero de datos.', mtError, [mbOk], 0);
5: MessageDlg('Acceso denegado para abrir el fichero de datos.', mtError, [mbOk], 0);
32: MessageDlg('Error al abrir el fichero de datos.', mtError, [mbOk], 0);
end;
result := FALSE;
end;
end;
result := TRUE;
end;

Y este el que lo lee:

function Read_Data(dat_path: string): boolean;
var
F: file;
begin
try
AssignFile(F, dat_path);
Reset(F, 1);
BlockRead(F, measur, SizeOf(measur));
BlockRead(F, fix, SizeOf(fix));
BlockRead(F, dat_a, SizeOf(dat_a));
CloseFile(F);
except
on EInOutError do
begin
case IOResult of
2: MessageDlg('El fichero de datos no existe.', mtError, [mbOk], 0);
3: MessageDlg('No se encuentra el directorio del fichero de datos.', mtError, [mbOk], 0);
5: MessageDlg('Acceso denegado para abrir el fichero de datos.', mtError, [mbOk], 0);
32: MessageDlg('Error al abrir el fichero de datos.', mtError, [mbOk], 0);
end;
result := FALSE;
end;
end;
result := TRUE;
end;


las variables measure, fix y dat_a son:

measur: array[0..12, 0..3] of byte;
Arreglo bidimencional para controlar las mediciones realizadas. Cada subíndice del arreglo corresponde a una hora desde las 05 hasta las 19.
Valores que puede tomar la variable: measur
|----------- Estado de la observación:
| 0 - medición sin realizar por la hora
| 1 - medición no realizada por fenómeno atmosférico (Fenómenos)
| 2 - medición no realizada por otras causas (Nota)
| 3 - medición realizada
| |-------- Actinometro: 0 No Activo (FALSE)
| | 1 Activo (TRUE)
| | |----- Piranometro: 0 No Activo (FALSE)
| | | 1 Activo (TRUE)
| | | | -- Balanzometro: 0 No Activo (FALSE)
| | | | 1 Activo (TRUE)
Los subindices 0 --> #, #, #, #
corresponden a | .
los horarios < .
desde las 05 | .
hasta las 19 15 --> #, #, #, #


fix: fix_rec;
Factores de conversión de los instrumentos
fix_rec = record // Datos fijos para un día de observación
est_code: word; // Código de la estación INCLUIR PARA EL NUEVO REPROCESAMIENTO
mdate, // Fecha de la medición
fc_acti, // Factor de conversion del Actinometro
fc_pira, // Factor de conversion del Piranómetro
fc_balan: single; // Factor de conversion del Balanzómetro
end;


dat_a: act_array; // Arreglo con los datos de la medición (Iniciales, Lecturas y Resultados)
act_array = array[0..12] of act_rec;
act_rec = record // Estructura de los datos de una medición
hini, // Hora de inicio de la medición
hfin, // Hora final de la medición
ho, // Altura del sol
seno_ho, // Seno de la altura del sol
delta_tau, // Delta TAU
declina, // Declinación
solar_time: double; // Tiempo solar o tiempo real
tnubes, // Total de nubes
nbajas, // Total de nubes bajas
cu, // Tipo de nube - Cumulos
cb, // Tipo de nube - Cumulos Nimbos
sc, // Tipo de nube - Estratos Cumulos
st, // Tipo de nube - Estratos
ac, // Tipo de nube - Altos Cumulos
ae, // Tipo de nube - Altos Estratos
ns, // Tipo de nube - Nimbo Estratos
ci, // Tipo de nube - Cirros
cs, // Tipo de nube - Cirros Estratos
cc, // Tipo de nube - Cirros Cumulos
ccielo, // Color del cielo
// 0 - No se reporta
// 1 - Azul
// 2 - Azul Claro
// 3 - Blanquecino
dsolar, // Estado del disco solar
// 0 - Sol cuadrado
// 1 - Sol
// 2 - Sol con grado
// 3 - Sol cubierto (P rusa)
// 4 - Sol Obstruido (no natural)
visib, // Visibilidad
mhierba, // Madurez de la hierba
// 0 - Verde
// 1 - Amarilla
// 2 - Seca
hhierba: byte; // Humedad de la hierba
// 0 - Seca
// 1 - Humeda
// 2 - Anegada
taires, // Temperatura del aire seca
taireh, // Temperatura del aire humeda
tsuelo: single; // Temperatura del la superficie activa
tactin: lec_array; // Temperatura para ajuste del actinómetro
humed: byte; // Humedad Relativa del aire
ajacti, // Ajuste del cero - actinómetro
ajbalan, // Ajuste del cero - Balanzómetro
ajpira, // Ajuste del cero - Piranómetro
fc_temp: single; // Factor de conversion por temperatura del Actinómetro
fenom: byte; // Fenómenos atmosféricos
// 0: No hay
// 1: Rocio
// 2: Bruma
// 3: Niebla
// 4: Neblina
// 5: Humo
// 6: Chubascos
// 7: Lluvia
// 8: Tormenta con Precipitacion
// 9: Tormenta sin precipitacion
//note, // Notas
note: ShortString; // Notas
observ: obs_array; // Nombre del observador
num_obs: word; // Numero del Observador
// LECTURAS DE LOS INSTRUMENTOS
P_D1, // Piranómetro (D1)
B_B, // Balanzómetro (B)
B_BS, // Balanzómetro (B-S')
P_Q, // Piranómetro (Q)
P_RC, // Piranómetro (Rc)
P_D2, // Piranómetro (D2)
BV_B, // Velocidad del viento (B)
BV_BS: lec_array; // Velocidad del viento (B-S')
A_D1, // Actinómetro (D1)
A_B, // Actinómetro (B)
A_BS, // Actinómetro (B-S')
A_Q, // Actinómetro (Q)
A_RC, // Actinómetro (Rc)
A_D2: single; // Actinómetro (D2)
dn: dn_rec; // Correciones de los instrumentos
nr: nr_rec; // Resultados intermedios
opv: opv_rec; // Resultados del procesamiento
end;


Necesito poder entender cómo funciona este código para pasarlo a java y realizar la lectura de estos ficheros..
Agradecería cualquier ayuda que me puedan brindar…
Este es mi correo por si me quieren contactar….

Un saludos y gracias….


Miguel Angel Sánchez
22 de Febrero del 2011
Hola, primero de todo, no sé si lo llamas delphis o delfis por algo en concreto.. me gustaría me lo explicases.

Bueno, respecto a tu consulta, sería mejor que hicieses preguntas concretas, ya que el código que pones es bastante explícito y nada complicado... ¿qué no entiendes exactamente?

A grandes rasgos, desde java, tienes que ir leyendo los datos del fichero, con el tamaño que por suerte además tienes (si tienes el código funcionando en Delphi, puedes poner un
ShowMessage('Tamaño de : ' + IntToStr(SizeOf()));


Donde será cada uno de las estructuras que se graban en el archivo.

Si tienes dudas más puntuales, pregunta!!

Douglas Alizares Camacho
22 de Marzo del 2011
|{[("problema en concreto")]}|!!!