myxxd(课上测试)

题目要求

  1. 学***d的使用,提交至少3个应用截图(3')
  2. xxd的主要功能是什么?需要使用什么系统调用来实现?写出你的推导过程,命令(3')
  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')

  1. 打开源文件,获取文件描述符 source_fd
  2. 创建或打开目标文件,获取文件描述符 target_fd
  3. 从源文件读取内容到缓冲区 buffer
  4. 对缓冲区的内容进行处理,生成十六进制表示
  5. 将处理后的内容写入目标文件或输出到屏幕
  6. 关闭文件描述符 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;
}


posted @ 2023-11-29 08:48  LLLZTTT  阅读(3)  评论(0编辑  收藏  举报
$