#!/usr/bin/perl # # bit_checker # # Checks to make sure the file only contains valid bits. # Only values of 0 and 1 are considered valid for bits. # # usage: bit_checker [<file> [...] ] # # Exit code 0 if no errors. # Nonzero exit code on error. # # Assumes an 8-bit per byte system # # Inspired by http://thedailywtf.com/Articles/Some-Crazy-Reason.aspx # use strict; use warnings; sub process { my ($fh, $name) = @_; my $error = 0; my $offset = 0; local $/ = \(64*1024); while (my $blk = <$fh>) { for my $byte_idx ( 0 .. length($blk)-1 ) { my $byte = ord(substr($blk, $byte_idx, 1)); for my $bit_idx ( reverse 0 .. 7 ) { my $bit = ( $byte >> $bit_idx ) & 1; if ($bit != 0 && $bit != 1) { $error = 1; warn("Found bad bit ($bit) in $name" ." at pos ".( $offset+$byte_idx ).":$bit_idx" .\n"); } } } $offset += length($blk); } return $error; } { my $error = 0; if (@ARGV) { for my $qfn (@ARGV) { # Raw stream without disabling buffering. open(my $fh, '<:unix:perlio', $qfn) or die("Can't open \"$qfn\": $!\n"); $error = process($fh, "file \"$qfn\"") || $error; } } else { binmode(*STDIN); $error = process(*STDIN, 'STDIN'); } exit($error); }
Getting 100% test coverage is going to be hard...
|
|---|
| Replies are listed 'Best First'. | |
|---|---|
|
Re: Bit Checker
by jwkrahn (Abbot) on Feb 16, 2009 at 22:57 UTC | |
by idsfa (Vicar) on Feb 17, 2009 at 14:49 UTC | |
by wol (Hermit) on Feb 18, 2009 at 16:40 UTC | |
|
Re: Bit Checker
by oxone (Friar) on Feb 19, 2009 at 16:37 UTC |