在我的last question , nos 给出了一种从 ASCII 字符字节中删除最高有效位的方法,这与我的教授在描述该项目时所说的完全吻合。
我的问题是如何使用 read
和 write
命令剥离有效位并将其打包到缓冲区中。由于 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/