demo_encoder.c

来自「自适应算术编解码」· C语言 代码 · 共 66 行

C
66
字号
#include <stdio.h>
#include <stdlib.h>
#include "ac.h"
#include "bmp.h"
#define check(b,m) \
do {\
if (b){\
printf(stderr, m);\
exit(1);\
}\
} while(0)

#define ADAPT 1
#define NSYM 256
// fp --> ace
int main(int argc, char* argv[])
{
	FILE *fp;
	int c;
	unsigned short identifier;
	ac_encoder ace;
	ac_model acm;
	Header *header;
	Info *info;

	check(argc < 3, "usage : with argument srcfilename dstfilename");
	ac_encoder_init(&ace, argv[2]);
	ac_model_init(&acm, NSYM, NULL, ADAPT);

	fp = fopen(argv[1], "rb");
	check(!fp, "could not open source file");

	fread((void*)&identifier, 2, 1, fp); // read identifier
	check(identifier != 0x4D42, "please give me a bmp file!");

	header = (Header*)malloc(sizeof(Header)); // read header
	fread((void*)header, sizeof(Header), 1, fp);
	check(header->bits != 8, "please give me a 8 bit bmp file!");

	info = (Info*)malloc(sizeof(Info)); //read info
	fread((void*)info, sizeof(Info), 1, fp);
	info->compression |= 8;

	fwrite((void*)&identifier, 2, 1, ace.fp); // write identifier
	fwrite((void*)header, sizeof(Header), 1, ace.fp); // write header
	fwrite((void*)info, sizeof(Info), 1, ace.fp); // write info
	header->offset -= (sizeof(Header) + sizeof(Info)); // write left
	while(header->offset > 0) {
		fputc(fgetc(fp), ace.fp);
		(header->offset)--;
	}

	// encode
	c = fgetc(fp);
	while (c != EOF) {
		ac_encode_symbol(&ace, &acm, c);
		c = fgetc(fp);
	}
	printf("bits for encoder : %d\n", (int)ac_encoder_bits(&ace));

	ac_encoder_done(&ace);
	ac_model_done(&acm);
	return 0;
}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?