如何从示例中获取 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