如何从示例中获取 LZW 编码结果?
How to get LZW encode results as from example?
根据第 http://michael.dipperstein.com/lzw/#example1 页上示例 1 的输入,我无法获得正确的结果:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "lzw.h"
void print_hex(unsigned char str[], int len)
{
int idx;
for (idx = 0; idx < len; idx++)
printf("%02x", str[idx]);
}
int main()
{
FILE *fpIn; /* pointer to open input file */
FILE *fpOut; /* pointer to open output file */
FILE *fptr;
char test_str_lzw[] = { "this_is_his_thing" };
fptr = fopen("lzw_in_test.txt", "wb");
fwrite(test_str_lzw, sizeof(char), strlen(test_str_lzw), fptr);
fclose(fptr);
fpIn = fopen("lzw_in_test.txt", "rb");
fpOut = fopen("lzw_out.txt", "wb");
LZWEncodeFile(fpIn, fpOut);
fclose(fpIn);
fclose(fpOut);
// Getting the results from file
if ((fptr = fopen("lzw_out.txt", "rb")) == NULL) {
printf("Error! opening file");
// Program exits if file pointer returns NULL.
exit(1);
}
unsigned char lzw_out[256];
memset(lzw_out, 0, 256);
size_t num;
num = fread(lzw_out, sizeof(unsigned char), 256, fptr);
fclose(fptr);
unsigned int lzw_size = num;
printf("LZW out size: %d\n", lzw_size);
printf("LZW out data: \n");
print_hex(lzw_out, lzw_size);
printf("\n");
return(0);
}
十六进制的预期结果:
0x74 0x68 0x69 0x73 0x5F 0x102 0x5F 0x101 0x103 0x100 0x69 0x6E 0x67
我得到的十六进制结果:
0x74 0x34 0x1A 0x4E 0x65 0xF0 0x15 0x7C 0x03 0x03 0x80 0x5A 0x4D 0xC6 0x70 0x20
任何人都可以帮我从示例中获取输出文件吗?
此致。
LZW 编码器正在将 9 位代码字序列编码为 8 位字节序列。有一种机制可以根据需要发出代码字长度增加的信号,但为了简单起见,我们忽略它,因为它不需要对短输入序列进行编码。
对于 OP 的示例,前八个 9 位代码字是(十六进制):
0x74 0x68 0x69 0x73 0x5F 0x102 0x5F 0x101
或者用二进制表示:
001110100 001101000 001101001 001110011 001011111 100000010 001011111 100000001
编码器将每个 9 位代码字分成两组 - 第 7 位到第 0 位,然后是第 8 位:
01110100 0 01101000 0 01101001 0 01110011 0 01011111 0 00000010 1 01011111 0 00000001 1
然后将其重新组合为 8 位字节序列:
01110100 00110100 00011010 01001110 01100101 11110000 00010101 01111100 00000011
或以十六进制表示:
0x74 0x34 0x1A 0x4E 0x65 0xF0 0x15 0x7C 0x03
根据第 http://michael.dipperstein.com/lzw/#example1 页上示例 1 的输入,我无法获得正确的结果:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "lzw.h"
void print_hex(unsigned char str[], int len)
{
int idx;
for (idx = 0; idx < len; idx++)
printf("%02x", str[idx]);
}
int main()
{
FILE *fpIn; /* pointer to open input file */
FILE *fpOut; /* pointer to open output file */
FILE *fptr;
char test_str_lzw[] = { "this_is_his_thing" };
fptr = fopen("lzw_in_test.txt", "wb");
fwrite(test_str_lzw, sizeof(char), strlen(test_str_lzw), fptr);
fclose(fptr);
fpIn = fopen("lzw_in_test.txt", "rb");
fpOut = fopen("lzw_out.txt", "wb");
LZWEncodeFile(fpIn, fpOut);
fclose(fpIn);
fclose(fpOut);
// Getting the results from file
if ((fptr = fopen("lzw_out.txt", "rb")) == NULL) {
printf("Error! opening file");
// Program exits if file pointer returns NULL.
exit(1);
}
unsigned char lzw_out[256];
memset(lzw_out, 0, 256);
size_t num;
num = fread(lzw_out, sizeof(unsigned char), 256, fptr);
fclose(fptr);
unsigned int lzw_size = num;
printf("LZW out size: %d\n", lzw_size);
printf("LZW out data: \n");
print_hex(lzw_out, lzw_size);
printf("\n");
return(0);
}
十六进制的预期结果:
0x74 0x68 0x69 0x73 0x5F 0x102 0x5F 0x101 0x103 0x100 0x69 0x6E 0x67
我得到的十六进制结果:
0x74 0x34 0x1A 0x4E 0x65 0xF0 0x15 0x7C 0x03 0x03 0x80 0x5A 0x4D 0xC6 0x70 0x20
任何人都可以帮我从示例中获取输出文件吗?
此致。
LZW 编码器正在将 9 位代码字序列编码为 8 位字节序列。有一种机制可以根据需要发出代码字长度增加的信号,但为了简单起见,我们忽略它,因为它不需要对短输入序列进行编码。
对于 OP 的示例,前八个 9 位代码字是(十六进制):
0x74 0x68 0x69 0x73 0x5F 0x102 0x5F 0x101
或者用二进制表示:
001110100 001101000 001101001 001110011 001011111 100000010 001011111 100000001
编码器将每个 9 位代码字分成两组 - 第 7 位到第 0 位,然后是第 8 位:
01110100 0 01101000 0 01101001 0 01110011 0 01011111 0 00000010 1 01011111 0 00000001 1
然后将其重新组合为 8 位字节序列:
01110100 00110100 00011010 01001110 01100101 11110000 00010101 01111100 00000011
或以十六进制表示:
0x74 0x34 0x1A 0x4E 0x65 0xF0 0x15 0x7C 0x03