Пишу программу, кодирующую файлы по алгоритму Фано.
Например, имеется файл source.txt с содержанием: aabda.
Тогда алгоритм следующий:
1. Узнаем кол-во символов - 5
2. Узнаем длину алфавита - 3
3. Узнаем буквы алфавита - a, b, d
4. Высчитываем коды символов, кодируем сообщение
Тут все просто
Но как мне закодировать, скажем какой-нибудь файл, например .docx, .psd etc?
Я правильно понимаю, нужно считывать не текстовый код нашего файла, а бинарный? И тогда алфавит будет из 2 символов - 0 и 1 и далее уже кодировать как обычную строку из примера выше, верно?
Если так, то как можно получить этот бинарный код указанного файла на языке С?
Пытаюсь сделать так:
int messageLen = 0; // длинна нашего файла
char mess[200000] = { 0 }; // место, куда будет сохранено содержимое файла
FILE *fp;
if ((fp = fopen("C:\\test\\test.docx", "rb")) == NULL) {
printf("Cannot open file.\n");
_getch();
exit(1);
}
int c;
while ((c = fgetc(fp))) {
if (c == EOF) break;
messageLen++;
}
fseek(fp, 0L, 0);
fread(mess, sizeof(char), messageLen, fp);
fclose(fp);
Но кодировка "ломается" при определении алфавита
И еще, как понять, что в переменной mess именно двоичный код нашего файла?
При printf("%s\n", mess); выводит непонятные символы