myxxd(课上测试)
题目要求
- 学***d的使用,提交至少3个应用截图(3')
- xxd的主要功能是什么?需要使用什么系统调用来实现?写出你的推导过程,命令(3')
- 写出实现xxd的伪代码(4')
4 编写myxxd实现xxd的功能(10')
5 myxxd 支持命令行传入参数-h n 显示前n个字节,-t n 显示最后面n 个字节,注意要先打印文件长度len, 保证n <= len(10')
题目1 学***d的使用,提交至少3个应用截图(3')
题目2 xxd的主要功能是什么?需要使用什么系统调用来实现?写出你的推导过程,命令(3')
-
xxd 的主要功能是显示文件的十六进制表示以及相关的ASCII字符,同时也能将十六进制表示还原为二进制文件。
-
在Unix/Linux系统中,xxd 主要通过使用以下系统调用来实现:
open(): 打开文件。
read(): 读取文件内容。
write(): 将处理后的内容写回文件或输出到屏幕。
close(): 关闭文件。 -
推导过程:
1.xxd 首先需要打开要处理的文件,以获取文件描述符。
int file_descriptor = open("example.txt", O_RDONLY);
2.读取文件内容,将其转换为十六进制表示。
ssize_t bytes_read = read(file_descriptor, buffer, sizeof(buffer));
3.将处理后的内容16进制写回文件或输出到屏幕。
for (int i = 0; i < bytes_read; i++) { printf("%02x ", buffer[i]); }
4.关闭文件。
close(file_descriptor);
题目3 写出实现xxd的伪代码(4')
- 打开源文件,获取文件描述符 source_fd
- 创建或打开目标文件,获取文件描述符 target_fd
- 从源文件读取内容到缓冲区 buffer
- 对缓冲区的内容进行处理,生成十六进制表示
- 将处理后的内容写入目标文件或输出到屏幕
- 关闭文件描述符 source_fd 和 target_fd
题目4、5 编写myxxd实现xxd的功能(10')。myxxd 支持命令行传入参数-h n 显示前n个字节,-t n 显示最后面n 个字节,注意要先打印文件长度len, 保证n <= len(10')
#include <stdio.h>
#include <stdlib.h>
void print_hex(FILE *file, size_t n, int is_head) {
unsigned char buffer[16];
size_t bytesRead;
size_t file_length;
// 获取文件长度
fseek(file, 0, SEEK_END);
file_length = ftell(file);
fseek(file, 0, SEEK_SET);
printf("File length: %zu bytes\n", file_length);
// 检查文件长度是否小于 n
if (file_length < n) {
fprintf(stderr, "Error: Requested number of bytes exceeds file length.\n");
exit(EXIT_FAILURE);
}
// 定位文件指针
if (is_head) {
fseek(file, 0, SEEK_SET); // 移动到文件开始位置
} else {
fseek(file, -n, SEEK_END); // 移动到文件末尾倒数第 n 个字节位置
}
// 读取并显示文件内容
while ((bytesRead = fread(buffer, 1, sizeof(buffer), file)) > 0) {
for (size_t i = 0; i < bytesRead; i++) {
printf("%02x ", buffer[i]);
}
printf("\n");
}
}
int main(int argc, char *argv[]) {
if (argc != 4 || (argv[2][0] != '-' && (argv[2][1] != 'h' || argv[2][1] != 't'))) {
fprintf(stderr, "Usage: %s <filename> -h n|-t n\n", argv[0]);
exit(EXIT_FAILURE);
}
FILE *file = fopen(argv[1], "rb");
if (!file) {
perror("Error opening file");
exit(EXIT_FAILURE);
}
size_t n = atoi(argv[3]);
if (n <= 0) {
fprintf(stderr, "Error: Invalid value for n.\n");
exit(EXIT_FAILURE);
}
if (argv[2][1] == 'h') {
print_hex(file, n, 1); // 显示前 n 个字节
} else {
print_hex(file, n, 0); // 显示最后 n 个字节
}
fclose(file);
return 0;
}