打印ASCII字符的二进制

时间:2019-09-04 03:42:52

标签: 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;

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

3 个答案:

答案 0 :(得分:1)

有很多方法可以做到这一点。以下输出了一个漂亮的可打印字符图表,给出了每个字符的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

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

答案 1 :(得分:0)

您可以创建一个函数,该函数将空指针和结构的大小作为输入。

A(:,:,j)

然后您可以为结构的每个元素调用此函数。

例如

j

您也可以将整个结构传递给上面的函数,但是它也会打印不需要的填充字节。

答案 2 :(得分:0)

此适合类型键入您想要的

#include <stdio.h>
#include <stdlib.h>
#define bitmask 0b1
void F1(void *a,int Len){
    int i,j;
    unsigned char*b=(unsigned char*)a;
    b+=Len-1;
    for(i=0;i<Len;i++,b--){
        for(j=7;j>-1;j--){
            printf("%d",((*b)&bitmask<<j)>>j);
        }
    }
    printf("\n");
}
int main(){ 

    unsigned int Q=10;
    F1(&Q,sizeof(unsigned int));

    unsigned short QQ=10;
    F1(&QQ,sizeof(unsigned short));

    unsigned char QQQ=10;
    F1(&QQQ,sizeof(unsigned char));
    return 0;
}