以C语言打印字节,仅以十六进制打印不可打印的字符

以C语言打印字节,仅以十六进制打印不可打印的字符,c,arrays,C,Arrays,我有一个程序创建一些字节字符串,这些字符串是人类可读文本和控制字节(包括空字节)的混合体。为了调试这些字符串,我希望有一个函数,在给定指针和大小的情况下打印这些字符串,这样我就可以读取屏幕上可打印的ASCII字符,以及不可打印字符的十六进制值(Python),例如 到目前为止,我有一个只打印可打印字符的函数: void print_bytes(unsigned char *bs, size_t size) { size_t i; for (i = 0; i < size;

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

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

void print_bytes(unsigned char *bs, size_t size) {
    size_t i;
    for (i = 0; i < size; i++) {
        fputc(bs[i], stdout);
    }
    printf("\n");
}
void print_字节(无符号字符*bs,大小){
尺寸i;
对于(i=0;i
除此之外,我在网上只看到过将所有内容打印为十六进制序列的示例,这并不能帮助我理解字符串的内容


如何改进上述函数以打印不可打印字符的十六进制值

使用注释中的建议,我重写了函数以使用
isprint
开关:

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");
}

void print_字节(常量无符号字符*bs,常量大小\u t大小){
对于(大小i=0;i
使用注释中的建议,我重写了函数以使用
isprint
开关:

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");
}

void print_字节(常量无符号字符*bs,常量大小\u t大小){
对于(大小i=0;i
如果您理解这些示例,是什么阻止您检查字符是否可打印、是否可打印并输出十六进制字符?
ctype.h
提供了
isprint()
宏,该宏可以简化
If(isprint(c)){/*打印它*/}否则{/*输出十六进制*/}
大卫,谢谢。这就是我想要的函数类型。请回答这个问题并做标记。它有助于其他人找到答案,这些答案将隐藏在注释中,而问题仍将被列为未回答。如果您理解这些示例,是什么阻止您检查字符是否可打印,如果可以,则输出字符,如果不可以,则输出十六进制?
ctype.h
提供了
isprint()
if(isprint(c)){/*打印它*/}else{/*输出十六进制*/}
David,谢谢。这就是我想要的函数类型。请回答这个问题并做标记。这有助于其他人找到解决方案,这些解决方案将隐藏在评论中,并且问题仍将被列为未回答。