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

标签 c bit-manipulation compression

在我的last question , nos 给出了一种从 ASCII 字符字节中删除最高有效位的方法,这与我的教授在描述该项目时所说的完全吻合。

我的问题是如何使用 readwrite 命令剥离有效位并将其打包到缓冲区中。由于 write 命令需要写入字节数的长度,我如何更深入到缓冲区数组的位级别?

最佳答案

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

我们称输入数据为input[0..7],输出数据为output[0..6]

因此,输出数据的第一个字节 output[0]input[0] 的低 7 位加上倒数第二高的位组成输入[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]

You can use operations like:

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 .

一旦压缩了一个八字节的 block ,写出七字节的压缩 block 并继续。

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

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

关于c - 简单的 ASCII 压缩 - 帮助最小化系统调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5073607/

相关文章:

简单字符串压缩算法

c - 为什么在使用函数时无法正确添加到链表?

c - C语言读取文件的困境

c++ - 是否有公式可以找到 float 中指数或有效位数的位数?

iphone - Objective-C 枚举最大(按位)限制(iPhone)

linux - 归档和压缩之间的区别

javascript - 如何正确压缩 Jquery 和大量插件?

c - Pthreads 在执行时更新全局 2D 数组段错误

c - 双面打印-C

java - 16位偏移和24位偏移是什么意思?我如何使用java进行这样的计算