Hi,
I have binary file, and I want to decode it.
This is the structure
#campo1: secuencia OCTET STRING (SIZE(4) CODE("LEFT") ) OPTIONAL,
#campo2_4: OCTET STRING (SIZE(2) CODE("LEFT") ) OPTIONAL, -- 2:TIPO DE REGISTRO, 4:TIPO ABONADO LLAMANTE, 10:HAZ ENTRANTE
#campo5_7: OCTET STRING (SIZE(1) CODE("LEFT") ) OPTIONAL, -- 5:CANAL ISDN, 2:TIPO DESTINACION DE LLAMADA, 1:FILLER
#campo8_9: OCTET STRING (SIZE(1) CODE("LEFT") ) OPTIONAL, -- 4:LONG RADICAL DEL LLAMANTE, 4:LONG TELF. LLAMANTE
#campo10: abonadoAOCTET STRING (SIZE(6) CODE("LEFT") ) OPTIONAL,
#campo11_12: OCTET STRING (SIZE(1) CODE("LEFT") ) OPTIONAL, -- 4:TIPO LLAMADA, 4:TIPO SERVICIO
#campo13: cifrasTecleadasOCTET STRING (SIZE(9) CODE("LEFT") ) OPTIONAL,
#campo14: duracionOCTET STRING (SIZE(4) CODE("RIGHT")) OPTIONAL,
#campo15: fecha OCTET STRING (SIZE(4) CODE("LEFT") ) OPTIONAL,
#campo16: impulsosOCTET STRING (SIZE(2) CODE("LEFT") ) OPTIONAL,
#campo17_21: OCTET STRING (SIZE(2) CODE("LEFT") ) OPTIONAL, -- 2:RESULT LLAMADA, 1:INDICADOR ACT FECHA/HORA, 1:SOBREFLUJOS DE IMPULSOS, 6:FILLER, 6:TIPO ORIGEN
#campo22_25: OCTET STRING (SIZE(2) CODE("LEFT") ) OPTIONAL, -- 2:IND. RESPUESTA, 2:IND. REGISTRO LLAMADA LARGA DURACION, 10:COD. HAZ SALIENTE, 2:TIPO CONECTIVIDAD
#campo26: numeracionAbrvOCTET STRING (SIZE(1) CODE("LEFT") ) OPTIONAL,
#campo27_28: OCTET STRING (SIZE(1) CODE("LEFT") ) OPTIONAL -- 4:CIFRA DISCRIMINATORIA DE IDIOMA, 4:FILLER
And this is my programm, but it doesn´t prints the fields correctly.
I think I'm not using unpack command correctly.
40 = means bytes
while ( sysread (FILE1, my $rec,40) )
{
# 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0
my @reg3 = unpack ("H2H2H2H2b2b4b10b5b2b1b4b4H2H2H2H2H2H2b4b4H2H2H2H2H2H2H2H2H2H2H2H2H2H2H2H2H2H2H2b2b1b1b6b6b2b2b10b2H2b4b4",
$rec);
$SecRec=$reg3[1]."".$reg3[0]."".$reg3[3]."".$reg3[2];
$Sec = hex ( $SecRec );
$t_p=$reg3[4] ; # tipo registro
$t_ab_ll=$reg3[5] ; # tipo abonado llamanta
$h_in=$reg3[6] ; # haz entrante
$c_i=$reg3[7] ; # canal isdn
$t_d=$reg3[8]; # tipo destinacion de llamada
$fill=$reg3[9]; # filler
$l_r=$reg3[10]; # long radical del llamante
$l_t=$reg3[11]; # long tel llamante
$Abonado1 = $reg3[12] ;
$Abonado2 = $reg3[13] ;
$Abonado3 = $reg3[14] ;
$Abonado4 = $reg3[15] ;
$Abonado5 = $reg3[16] ;
$Abonado6 = $reg3[17] ;
$tipo_llamada = $reg3[18] ; # tipo llamada
$tipo_servicio = $reg3[19] ; #tipo servicio
$ct1 = $reg3[20]; #cifras tecleadas
$ct2 = $reg3[21]; #cifras tecleadas
$ct3 = $reg3[22]; #cifras tecleadas
$ct4 = $reg3[23];
$ct5 = $reg3[24];
$ct6 = $reg3[25];
$ct7 = $reg3[26];
$ct8 = $reg3[27];
$ct9 = $reg3[28]; #cifras tecleadas
$cte = $ct1.":".$ct2.":".$ct3.":".$ct4.":".$ct5.":".$ct6.":".$ct7.":".$ct8.":".$ct9."\n";
$dura = $reg3[30]."".$reg3[29]."".$reg3[32]."".$reg3[31];
$Segundos = hex ( $dura );
$f1 = $reg3[34];
$f2 = $reg3[33];
$f3 = $reg3[36];
$f4 = $reg3[35];
$impu1 = $reg3[37];
$impu2 = $reg3[38];
$campo17 = $reg3[39];
$campo18 = $reg3[40];
$campo19 = $reg3[41];
$campo20 = $reg3[42];
$campo21 = $reg3[43];
$campo22 = $reg3[44];
$campo23 = $reg3[45];
$campo24 = $reg3[46];
$campo25 = $reg3[47];
$num_abr = $reg3[48];
$campo27 = $reg3[49];
$campo28 = $reg3[50];
for ($i=4;$i<=12;$i++){
# if ($i==0){
print $reg3[$i]."!"
#}
}
print "\n";
}
close(FILE1);
Thanks a lot for your assistance.
I have binary file, and I want to decode it.
This is the structure
#campo1: secuencia OCTET STRING (SIZE(4) CODE("LEFT") ) OPTIONAL,
#campo2_4: OCTET STRING (SIZE(2) CODE("LEFT") ) OPTIONAL, -- 2:TIPO DE REGISTRO, 4:TIPO ABONADO LLAMANTE, 10:HAZ ENTRANTE
#campo5_7: OCTET STRING (SIZE(1) CODE("LEFT") ) OPTIONAL, -- 5:CANAL ISDN, 2:TIPO DESTINACION DE LLAMADA, 1:FILLER
#campo8_9: OCTET STRING (SIZE(1) CODE("LEFT") ) OPTIONAL, -- 4:LONG RADICAL DEL LLAMANTE, 4:LONG TELF. LLAMANTE
#campo10: abonadoAOCTET STRING (SIZE(6) CODE("LEFT") ) OPTIONAL,
#campo11_12: OCTET STRING (SIZE(1) CODE("LEFT") ) OPTIONAL, -- 4:TIPO LLAMADA, 4:TIPO SERVICIO
#campo13: cifrasTecleadasOCTET STRING (SIZE(9) CODE("LEFT") ) OPTIONAL,
#campo14: duracionOCTET STRING (SIZE(4) CODE("RIGHT")) OPTIONAL,
#campo15: fecha OCTET STRING (SIZE(4) CODE("LEFT") ) OPTIONAL,
#campo16: impulsosOCTET STRING (SIZE(2) CODE("LEFT") ) OPTIONAL,
#campo17_21: OCTET STRING (SIZE(2) CODE("LEFT") ) OPTIONAL, -- 2:RESULT LLAMADA, 1:INDICADOR ACT FECHA/HORA, 1:SOBREFLUJOS DE IMPULSOS, 6:FILLER, 6:TIPO ORIGEN
#campo22_25: OCTET STRING (SIZE(2) CODE("LEFT") ) OPTIONAL, -- 2:IND. RESPUESTA, 2:IND. REGISTRO LLAMADA LARGA DURACION, 10:COD. HAZ SALIENTE, 2:TIPO CONECTIVIDAD
#campo26: numeracionAbrvOCTET STRING (SIZE(1) CODE("LEFT") ) OPTIONAL,
#campo27_28: OCTET STRING (SIZE(1) CODE("LEFT") ) OPTIONAL -- 4:CIFRA DISCRIMINATORIA DE IDIOMA, 4:FILLER
And this is my programm, but it doesn´t prints the fields correctly.
I think I'm not using unpack command correctly.
40 = means bytes
while ( sysread (FILE1, my $rec,40) )
{
# 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0
my @reg3 = unpack ("H2H2H2H2b2b4b10b5b2b1b4b4H2H2H2H2H2H2b4b4H2H2H2H2H2H2H2H2H2H2H2H2H2H2H2H2H2H2H2b2b1b1b6b6b2b2b10b2H2b4b4",
$rec);
$SecRec=$reg3[1]."".$reg3[0]."".$reg3[3]."".$reg3[2];
$Sec = hex ( $SecRec );
$t_p=$reg3[4] ; # tipo registro
$t_ab_ll=$reg3[5] ; # tipo abonado llamanta
$h_in=$reg3[6] ; # haz entrante
$c_i=$reg3[7] ; # canal isdn
$t_d=$reg3[8]; # tipo destinacion de llamada
$fill=$reg3[9]; # filler
$l_r=$reg3[10]; # long radical del llamante
$l_t=$reg3[11]; # long tel llamante
$Abonado1 = $reg3[12] ;
$Abonado2 = $reg3[13] ;
$Abonado3 = $reg3[14] ;
$Abonado4 = $reg3[15] ;
$Abonado5 = $reg3[16] ;
$Abonado6 = $reg3[17] ;
$tipo_llamada = $reg3[18] ; # tipo llamada
$tipo_servicio = $reg3[19] ; #tipo servicio
$ct1 = $reg3[20]; #cifras tecleadas
$ct2 = $reg3[21]; #cifras tecleadas
$ct3 = $reg3[22]; #cifras tecleadas
$ct4 = $reg3[23];
$ct5 = $reg3[24];
$ct6 = $reg3[25];
$ct7 = $reg3[26];
$ct8 = $reg3[27];
$ct9 = $reg3[28]; #cifras tecleadas
$cte = $ct1.":".$ct2.":".$ct3.":".$ct4.":".$ct5.":".$ct6.":".$ct7.":".$ct8.":".$ct9."\n";
$dura = $reg3[30]."".$reg3[29]."".$reg3[32]."".$reg3[31];
$Segundos = hex ( $dura );
$f1 = $reg3[34];
$f2 = $reg3[33];
$f3 = $reg3[36];
$f4 = $reg3[35];
$impu1 = $reg3[37];
$impu2 = $reg3[38];
$campo17 = $reg3[39];
$campo18 = $reg3[40];
$campo19 = $reg3[41];
$campo20 = $reg3[42];
$campo21 = $reg3[43];
$campo22 = $reg3[44];
$campo23 = $reg3[45];
$campo24 = $reg3[46];
$campo25 = $reg3[47];
$num_abr = $reg3[48];
$campo27 = $reg3[49];
$campo28 = $reg3[50];
for ($i=4;$i<=12;$i++){
# if ($i==0){
print $reg3[$i]."!"
#}
}
print "\n";
}
close(FILE1);
Thanks a lot for your assistance.