my($data, $n); my $bufsize = 4096; my $mask0 = "\xff\0" x ($bufsize / 2 + 1); my $mask1 = "\0\xff" x ($bufsize / 2 + 1); $data = "\0"; while (($n = read $file, $data, $bufsize, 1) != 0) { print $reversedFile substr(((substr($data,2) & $mask0) | ($data & $mask1)), 0, $n); }