【问题标题】:Print bytes in C, only non-printable characters as hex在 C 中打印字节,仅将不可打印字符打印为十六进制
【发布时间】:2019-10-10 21:13:23
【问题描述】:

我有一个程序创建一些混合了人类可读文本和控制字节(包括空字节)的字节字符串。为了调试这些字符串,我想要一个打印这些字符串的函数,给定一个指针和一个大小,我可以在屏幕上读取可打印的 ASCII 字符,以及不可打印的十六进制值那些(à la Python),例如

first string\x00second string\x00\x01

到目前为止,我有一个只打印可打印字符的函数:

void print_bytes(unsigned char *bs, size_t size) {
    size_t i;
    for (i = 0; i < size; i++) {
        fputc(bs[i], stdout);
    }
    printf("\n");
}

除此之外,我只看到在线示例将所有内容打印为十六进制序列,这无​​助于我理解字符串的内容。

如何改进上述功能以打印不可打印字符的十六进制值?

【问题讨论】:

  • 如果你理解这些例子,是什么阻止你检查字符是否可打印,如果可以输出它,如果不是,则以十六进制输出?
  • ctype.h 提供了isprint() 宏,可以简化你的if (isprint (c)) { /* print it */ } else { /* output hex */ }
  • 大卫,谢谢。这就是我正在寻找的函数类型。
  • 请将此作为答案并标记。它可以帮助其他人找到将隐藏在 cmets 中的解决方案,并且问题仍将被列为未回答。

标签: c arrays


【解决方案1】:

使用评论中的建议,我重写了函数以使用isprint swicth:

void print_bytes(const unsigned char *bs, const size_t size) {
    for (size_t i = 0; i < size; i++) {
        if isprint(bs[i]) {
            fputc(bs[i], stdout);
        } else {
            printf("\\x%02x", bs[i]);
        }
    }
    printf("\n");
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-12-25
    • 2012-05-22
    • 1970-01-01
    • 1970-01-01
    • 2015-12-16
    • 2011-04-03
    • 1970-01-01
    相关资源
    最近更新 更多