84 47 00 0c 00 00 11 0a 03 50 35 04 00 64 0a 04 16 12 00 1e 00 1d 00 00 65 09 08 54 52 03 2f 82 05 10 00 02 6e 06 0b a8 53 11 67 00 00 00 7a 7f 00 69 4a 42 47 48 4a 41 0c 00 6a 53 54 4d 44 54 4f 1c 00 66 04 00 00 84 43 00 0c 00 00 11 09 08 43 49 29 60 64 0a 04 16 12 00 21 00 1b 00 00 65 09 08 44 80 90 0f 82 05 10 00 04 6e 06 08 ac 9b 02 67 00 00 00 7a 7f 00 69 53 54 4d 44 54 49 1f 00 6a 4b 43 47 48 51 42 3d 00 #### 64 0a 04 16 12 00 1e 00 1d 00 00 65 09 08 54 52 03 2f 82 05 10 00 02 6e 06 0b a8 53 11 67 00 00 00 7a 7f 00 69 4a 42 47 48 4a 41 0c 00 6a 53 54 4d 44 54 4f 1c 00 66 04 00 00 84 43 00 0c 00 00 11 09 08 43 49 29 60 64 0a 04 16 12 00 21 00 1b 00 00 65 09 08 44 80 90 0f 82 05 10 00 04 6e 06 08 ac 9b 02 67 00 00 00 7a 7f 00 69 53 54 4d 44 54 49 1f 00 6a 4b 43 47 48 51 42 3d 00 #### #!/usr/bin/perl -w use Cwd; use warnings; use strict; use Getopt::Long; use Switch; use constant FILEHDR => 4; use constant CDRLEN => 286; my ($trace, $help, $infile); my $swap = ''; my $indir = getcwd; my $outdir = getcwd; GetOptions ( "h|help" => \$help, "filename|f=s" => \$infile, "swap|s" => \$swap, "input|i=s" => \$indir, "output|o=s" => \$outdir, "trace|t" => \$trace ) or usage(); sub usage { exit; } my @tt = ("Flags", "Record Seq.", "LAC Length", "Directory No", "Others"); my @dtf = ("Year","Month","Day","Hour","Minute","Second", "Reserved","Duration"); my $outfile = $infile; my $data; my $i; sub inttohex { my $int = shift; return sprintf ("%02X", $int); } sub hextoint { my $hex = shift; return sprintf ("%d", hex($hex)); } ## Convert each ASCII character to a two-digit hex number. sub asctohex () { (my $hex = shift) =~ s/(.|\n)/sprintf("%02lx", ord $1)/eg; return $hex; } # Convert each two-digit hex number back to an ASCII character. sub hextoasc { (my $asc = shift) =~ s/([a-fA-F0-9]{2})/chr(hex $1)/eg; return $asc; } sub strtoasc { my $str = shift; my $asc = ""; my $loc = 0; my $i; for ($i = 0; $i < length($str); $i+=2) { $asc = $asc . hextoasc(substr($str, $loc, 2)); $loc = $loc + 2; } return $asc; } my ($partnerdir_no); if ($infile) { #open (OUTPUT, ">$outdir/$outfile"); open (DATA, "$indir/$infile"); binmode DATA; my @rec; until (eof DATA) { read (DATA, $data, 2); my $tag = unpack "H2", substr $data,0,1,''; my $length = unpack "C", substr $data,0,1,''; $length -= 2; if ($length == "81") { $length = unpack "C", substr $data,0,1,''; $length -= 1; } my $loc = 0; while (read (DATA, $data, $length)) { my @header = unpack "H6 H2 H2 H12", substr $data,0,11,''; if ($trace) { printf ("%-20s : %-5s >%s<\n", "TAG" , $tag, inttohex($tag)); printf ("%-20s : %-5s >%s<\n", "RECORD LENGTH", $length+2, inttohex($length+2)); printf ("HEADER\n"); for ($i=0; $i<@header; $i++) { printf (" |- %-16s : %s\n", $tt[$i],$header[$i]); } } printf ("\nDATA PACKAGE\n"); while ($data) { $tag = unpack "C", substr $data,$loc,1,''; printf ("%-20s : %-5s >%s<\n", "TAG", $tag, inttohex($tag)); switch ($tag) { # x64 - length fix 11 bytes case 100 { @rec = unpack "C C C C C C C C3", substr $data,0,10; printf " |- DateTime/Duration\n"; for (my $i=0; $i<8; $i++) { printf " |- %-20s : %02s >%s<\n", $dtf[$i], $rec[$i], inttohex($rec[$i]); } } # x65 case 101 { my $length = unpack "C", substr $data,0,1,''; $length += 1; if ($length == "81") { $length = unpack "C", substr $data,0,1,''; $length += 1; } $partnerdir_no = unpack "H*", substr $data,0,$length; printf ("PARTNER DIRECTORY NO. : %s\n", $partnerdir_no); } } } } } close(DATA); #close(OUTPUT); }