@Narts

Кодирование исполнительных файлов?

Пишу программу, кодирующую файлы по алгоритму Фано.

Например, имеется файл 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); выводит непонятные символы
  • Вопрос задан
  • 137 просмотров
Решения вопроса 1
GavriKos
@GavriKos
Да, читать как бинарный. Но нет, алфавит будет не из 0 и 1 состоять. Читается не побитово, а побайтово - т.е. минимальная единица - байт, а значит алфавит максимум из 255 символов состоит.

Но в целом, в теории - вы можете за минимальную единицу брать что угодно - лишь бы этого чего угодно было целое число в вашем массиве данных.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы