gpt4 book ai didi

c - 了解 Unix 中的 `read, write` 系统调用

转载 作者:行者123 更新时间:2023-11-30 14:29:15 25 4
gpt4 key购买 nike

我的系统编程项目让我们实现一个压缩/解压缩程序,通过删除最高位零并将输出写入单独的文件来压缩 ASCII 文本文件,具体取决于压缩或解压缩例程是否正常工作。为此,教授要求我们使用二进制文件和Unix系统调用,其中包括打开、关闭、读取、写入等。

根据我对读写的理解,它通过定义的字节 block 读取二进制数据。但是,由于该数据是二进制的,我不确定如何解析它。

这是我的代码的精简版本,减去错误检查:

void compress(char readFile[]){

char buffer[BUFFER] //buffer size set to 4096, but tunable to system preference
int openReadFile;
openReadFile= open(readFile, O_RDONLY);
}

如果我使用read将数据读入buffer,buffer中的数据是二进制还是字符格式?我遇到的任何内容都没有解决这个细节,它与我如何解析内容非常相关。

最佳答案

read() 将在不进行任何解释的情况下读取字节(因此是“二进制”模式)。

作为二进制,并且您想要访问各个字节,您应该使用 unsigned char 的缓冲区无符号字符缓冲区[BUFFER]。您可以将 char/unsigned char 视为字节,它们在 Linux 上为 8 位。

现在,由于您正在处理的是 8 位 ASCII 压缩为 7 位,因此您必须再次将这 7 位转换为 8 位,以便能够理解数据。

为了解释所做的事情 - 考虑文本 Hey 。这是 3 个字节。每个字节有 8 位,在 ASCII 中这就是位模式:

01001000 01100101 01111001

现在,从中删除最高有效位,将剩余的位向左移动一位。

X1001000 X1100101 X1111001

上面,X 是要删除的位。删除这些,并移动其他的,您最终会得到以下模式的字节:

10010001 10010111 11001000

最右边的3位只是用0填充。但到目前为止,还没有节省任何空间。还有3个字节。对于 8 字节的字符串,我们节省了 1 字节,因为这样会压缩到 7 字节。

现在您必须对读回的字节执行相反的操作

关于c - 了解 Unix 中的 `read, write` 系统调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5070826/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com