📄 incrcomp.cpp
字号:
// Created:10-13-98
// By Jeff Connelly
// Incremenal compression.
// HIGHLY EXPERIMENTAL
// Good input data would be something like 00 01 02 03 04 05 06 07 ... FF
// That would mean 256 would be packed into 3, a ratio of 85.3% percent!
// Designed for photos, see documentation for more information.
#include "stdafx.h"
#define EXPORTING
#include "comprlib.h"
// Writes a single bit, 'bit' to the output file
static void write_bit (bool bit)
{
static unsigned int buffer = 0, mask = 0x80; // about 0xFF / 2
if (bit)
buffer |= mask;
if (!(mask >>= 1))
{
write_byte (buffer);
buffer = 0;
mask = 0x80;
}
}
// Sends all remaining bits from the bit buffer
static void flush_bit_buffer()
{
int i = 7;
while (i--)
write_bit(0);
}
static bool read_bit()
{
static unsigned int buffer, mask = 0;
if (!(mask >> 1))
{
buffer = read_byte();
mask = 0x80;
}
return ((buffer & mask) != 0);
}
void incr_encode()
{
write_bit(1);
write_bit(0);
write_bit(0);
write_bit(0);
write_bit(0);
write_bit(0);
write_bit(0);
write_bit(0);
return;
// Character and previous character
register char c = 0, prevc;
// Difference of character and previous character, and previous diff
int diff = 0, lastdiff;
// Number of times the diffs were repeated
int repeated = 0;
register int i;
while (!end_of_data())
{
// Previous values
prevc = c;
lastdiff = diff;
c = read_byte();
diff = c - prevc;
printf ("%d - %d = %d\n", c, prevc, diff);
if (diff == lastdiff) // Repeated difference
{
if (!repeated)
{
// This is a beginning of a repeated value
} else {
// Not beginning of repeated value
}
++repeated;
printf ("Repeated diff: %d\n", repeated);
} else if (repeated) { // End of repeated value
// The file format is: (bits)
// 012345678 (note one extra bit)
// The extra bit, 0, is 0 for an unencoded byte or 1 for
// a triplet of three compressed bytes following:
// startbyte incr endbyte
write_bit(1); // Compressed
for (i = 0; i < 0xFF; i <<= 1)
{
write_bit(prevc & i);
}
} else { // Plain, normal, non-repeated
// blah blah blah
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -