[ create a new paste ] login | about

Link: http://codepad.org/rcpEkMZn    [ raw code | fork ]

Perl, pasted on Aug 13:
#!/usr/bin/perl -w

select(STDERR);
$| = 1;
select(STDOUT); # default
$| = 1;

my $name = $ARGV[0];

if (not defined $name) {
  die "Need input filename\n";
}

open (IN_FILE, $name)
  or die "Couldn't open $name for reading";

binmode(IN_FILE);

while (!eof(IN_FILE)) {
$crc=0;

# find a 2-bytes header 00 01

$hfound=0;
$prev=0xFF;
while (!$hfound) {
   read(IN_FILE, $byte, 1);
   if (eof(IN_FILE)) {goto EEOF};
   $data=ord($byte);
   $w=($data << 8) | $prev;
   if($w==1){
      $hfound=1;
      printf("Header 00 01 found!\n");
   } else {
      $prev=$data;
   };
};

read(IN_FILE, $byte, 1);
$locnt=ord($byte);
$crc=($crc+$locnt) & 0xFF;
read(IN_FILE, $byte, 1);
$hicnt=ord($byte);
$crc=($crc+$hicnt) & 0xFF;

$cnt=($hicnt<< 8) | $locnt;

printf("Counter=%06o (%d %04XH) +6\n",$cnt,$cnt,$cnt);

read(IN_FILE, $byte, 1);
$loadr=ord($byte);
$crc=($crc+$loadr) & 0xFF;
read(IN_FILE, $byte, 1);
$hiadr=ord($byte);
$crc=($crc+$hiadr) & 0xFF;

$adr=($hiadr<< 8) | $loadr;

printf("Address=%06o (%d %04XH)\n",$adr,$adr,$adr);


#read $cnt-6 bytes and calculate checksum
for($i=0;$i<($cnt-6);$i++) {
   read(IN_FILE, $byte, 1);
   $data=ord($byte);
   $crc=($crc+$data) & 0xFF;
   };
read(IN_FILE, $byte, 1);
$fcrc=ord($byte);
$crc=(~$crc)& 0xFF;
printf("CRC from file = %03o %02XH\n",$fcrc,$fcrc);
printf("CRC from calc = %03o %02XH\n",$crc,$crc);

if ($fcrc==$crc) {
   printf("CRC correct!\n");
   } else {
   printf("CRC not correct!\n");
   }
}

EEOF:

close(IN_FILE);


Create a new paste based on this one


Comments: