c - 打印 ASCII 字符的二进制

标签 c

我使用以下方法来打印 ascii 字符的二进制文件:

unsigned char bitmask = 0b10000000;
char _my_char = 'a';
for (int i=0; i<8; i++) {
    if (i==4) putchar(' '); // separate every four characters
    printf("%d", (_my_char & bitmask) != 0);
    bitmask = bitmask >> 1;
}
putchar('\n');
return 0;

我如何概括这一点,例如,我可以打印任何数据类型/结构的二进制文件?每行一个字节?

最佳答案

有很多方法可以做到这一点。下面输出了一个很好的可打印字符图表,给出了每个字符的 ASCII、十进制、十六进制和二进制值,例如

#include <stdio.h>
#include <limits.h>

/* CHAR_BIT */
#ifndef CHAR_BIT
#define CHAR_BIT  8
#endif

int main (void) {

    char c = 0;     /* character */
    int i = 0;      /* int loop counter */

    printf ("\nchar |  int  |  hex   |  binary\n");
    printf ("-----+-------+--------+---------\n");
    for (c = 32; c <= 126; c++) {   /* for each char in printable range  */
        /* output the character, decimal, hex and binary */
        printf ("  %c  |  %3d  |  0x%02x  | ", c, c, c);

        for (i = sizeof (c) * CHAR_BIT - 1; i >= 0; i--)    /* for each bit */
            printf ("%d", ((c >> i) & 0x1) ? 1 : 0);        /* output 0/1 */
        putchar ('\n');                                     /* output \n */
    }

    putchar ('\n');
}

示例使用/输出

$ ./bin/bin_ascii

char |  int  |  hex   |  binary
-----+-------+--------+---------
     |   32  |  0x20  | 00100000
  !  |   33  |  0x21  | 00100001
  "  |   34  |  0x22  | 00100010
  #  |   35  |  0x23  | 00100011
  $  |   36  |  0x24  | 00100100
  %  |   37  |  0x25  | 00100101
  &  |   38  |  0x26  | 00100110
  '  |   39  |  0x27  | 00100111
  (  |   40  |  0x28  | 00101000
  )  |   41  |  0x29  | 00101001
  *  |   42  |  0x2a  | 00101010
  +  |   43  |  0x2b  | 00101011
  ,  |   44  |  0x2c  | 00101100
  -  |   45  |  0x2d  | 00101101
  .  |   46  |  0x2e  | 00101110
  /  |   47  |  0x2f  | 00101111
  0  |   48  |  0x30  | 00110000
  1  |   49  |  0x31  | 00110001
  2  |   50  |  0x32  | 00110010
  3  |   51  |  0x33  | 00110011
  4  |   52  |  0x34  | 00110100
  5  |   53  |  0x35  | 00110101
  6  |   54  |  0x36  | 00110110
  7  |   55  |  0x37  | 00110111
  8  |   56  |  0x38  | 00111000
  9  |   57  |  0x39  | 00111001
<snip>
  p  |  112  |  0x70  | 01110000
  q  |  113  |  0x71  | 01110001
  r  |  114  |  0x72  | 01110010
  s  |  115  |  0x73  | 01110011
  t  |  116  |  0x74  | 01110100
  u  |  117  |  0x75  | 01110101
  v  |  118  |  0x76  | 01110110
  w  |  119  |  0x77  | 01110111
  x  |  120  |  0x78  | 01111000
  y  |  121  |  0x79  | 01111001
  z  |  122  |  0x7a  | 01111010
  {  |  123  |  0x7b  | 01111011
  |  |  124  |  0x7c  | 01111100
  }  |  125  |  0x7d  | 01111101
  ~  |  126  |  0x7e  | 01111110

如果您对逻辑有任何疑问,请告诉我。

关于c - 打印 ASCII 字符的二进制,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57781205/

相关文章:

android - Google Tango Leibniz API 中的彩色图像

在循环中结合使用简写 c if else 语句和 break 会导致错误

c - scanf 和 p 转换说明符

c - 内存指针和数组

c - 理解 C 中的积分运算

c - C中重复某个菜单的函数

c - 将数组传递给函数,将数组的每个值乘以 10

c - 无法理解指向指针输出的指针 : 15 15

c - 函数的多个定义错误

c - 在 C 中,使用用户输入值计算方程没有给出预期结果?