简单的ASCII压缩 - 帮助最小化系统调用

时间:2011-02-22 03:08:14

标签: c bit-manipulation compression

在我的last question中,nos提供了一种从ASCII字符字节中删除最重要位的方法,这与我教授在描述项目时所说的完全一致。

我的问题是如何使用readwrite命令去除重要位并将其打包到缓冲区中。由于write命令占用了要写入的字节数的长度,因此如何更深入地处理缓冲区数组的位级别?

3 个答案:

答案 0 :(得分:3)

最简单的方法可能是八个字节的块。读入一个块然后使用按位运算符将它们压缩为七个字节。

让我们调用输入数据input[0..7]和输出数据output[0..6]

因此,输出数据的第一个字节output[0]input[0]的低7位加上input[2]的第二高位组成。对所有其他人来说也是如此:

    Index:    [0]      [1]      [2]      [3]      [4]      [5]      [6]      [7]
    Input:  0aaaaaaa 0bbbbbbb 0ccccccc 0ddddddd 0eeeeeee 0fffffff 0ggggggg 0hhhhhhh
            ///////  //////   and     --->
            ||||||| /|||||     so on  --->
    Output: aaaaaaab bbbbbbcc cccccddd ddddeeee eeefffff ffgggggg ghhhhhhh
    Index:    [0]      [1]      [2]      [3]      [4]      [5]      [6]

您可以使用以下操作:

output[0] = ((input[0] & 0x7f) << 1) | ((input[1] & 0x40) >> 6)
output[1] = ((input[1] & 0x3f) << 2) | ((input[2] & 0x60) >> 5)
:
output[5] = ((input[5] & 0x03) << 6) | ((input[6] & 0x7e) >> 1)
output[6] = ((input[6] & 0x01) << 7) |  (input[7] & 0x7f)

其他的应该可以从上面那些计算。如果您想了解有关按位运算符的更多信息,请参阅here

一旦你压缩了一个8字节的块,写出七字节的压缩块继续运行。

唯一稍微棘手的一点是在最后你可能没有完整的八个字节。在这种情况下,您将输出与输入一样多的字节,但最后一个将填充零位。

而且,在减压方面,你会做相反的事情。读入七个字节的块,使用按位运算符扩展并写出八个字节。您还可以根据读入的最后一个部分的大小来确定哪些位在末尾填充。

答案 1 :(得分:2)

正如paxdiablo所说:最简单的方法是用八个字节的块。 但为什么要换8字节?您可以打包最后一个字节的前7个字节位! 简单快速......

Output[0] = ((Input[0] & 0x7f) | (Input[7] & 0x80))         //pack 7th bit in 0th byte
Output[1] = ((Input[1] & 0x7f) | ((Input[7] << 1) & 0x80))  //pack 6th bit in 1th byte
Output[2] = ((Input[2] & 0x7f) | ((Input[7] << 2) & 0x80))  //pack 5th bit in 2th byte
...

对于恢复,只需将所有7个字节的第7位放入第7个字节,并清除所有数组字节中的第7位。

答案 2 :(得分:1)

您需要先将数据打包到内存中的缓冲区中。例如,为了简单起见:

unsigned char unpacked[128];  // read file input into this buffer
unsigned char packed[128];    // copy from unpacked to here while compressing
                              // then write() this to output file...

要自己进行压缩,需要循环读入unpacked的字节数并使用按位运算符,例如&(按位AND),|(按位OR) ,<<按位左移。

如果此过程的某些特定部分您不知道该怎么做,请向我们展示您的尝试(在代码中),我们会向您提供更多详细信息,但您不能指望(或从中受益)你的所有作业。