Читаем блоками по 24 байта, каждый блок должен дать один байт на выходе.Каждая тройка байт (24 бита) определяет 1 или 0. Посчитаем в каждой тройке количество бит =1. Если их меньше 2, значит закодирован 0, иначе 1. Проверку выполняем 8 раз, получая вектор вида 0,1,0,0,1,...
Вектор объединяем в строку вида "01001...", строку упаковываем в байт, байт выводим.
Пишем это на Perl, читать придётся от конца к началу:
#!/usr/bin/perl
use warnings;
use strict;my $buf;
open(FH,$ARGV[0]);
print pack("B8",join('',map $_ < 2 ? 0 : 1, unpack("(%B24)8", $buf))) while(read(FH,$buf,24)==24);
Чтобы получить частотный словарь, напиши что-нибудь вроде $freq{$sym}++