ASCII到二进制表示(Big Endian)

时间:2011-10-25 21:37:49

标签: c string parsing binary endianness

我正在编写一个函数,将ascii字符串转换为big endian中的二进制表示。

这是我的代码:

    int count = 0;
    for (int i = 0; i < num_strs; i++) {

        for (int j = 0; j < 5; j++) {
            char c = sep_str[i][j];
            for (int k = 7; k >= 0; k--) {
                putchar((c & (1 << k)) ? '1' : '0');
                count++;
            }

            if (count == 32) {
                putchar('\n');
                count = 0;
            }
        }
    }

我试图将每个字符填充到32位。例如,空格为0x20 - &gt; 1000000。我希望将其写为00000000000000000000000001000000并将每个32位二进制数写在一个单独的行上。我的代码会改变什么?

我尝试将for k外观更改为从32开始,但显然不起作用......

3 个答案:

答案 0 :(得分:0)

printf("0000000000000000000000000"); // 25 zeros, leaving 7 bits for ASCII
for (int k = 6; k >= 0; k--) {
    putchar((c & (1 << k)) ? '1' : '0');
}
putchar('\n');

答案 1 :(得分:0)

您所要做的就是在每个字节前添加24 0。一种方法是实际遍历所有32位,但只检查最后8位的1:

for (int i = 0; i < num_strs; i++) {
    for (int j = 0; j < 5; j++) {
        char c = sep_str[i][j];
        for (int k = 31; k >= 0; k--) {
            putchar((k <= 7 && c & (1 << k)) ? '1' : '0');
        }
        putchar('\n');
    }
}

答案 2 :(得分:0)

假设如下:

  • sep_str是一个以空字符结尾的字符串数组
  • 你想要打印为32位的4字节组(而不是前面有24个额外零的1字节)
  • 您希望在开头而不是结尾
  • 填充

..然后你可以看看以下内容。如果这些假设中的任何一个是错误的,那么有很多评论,您应该可以根据需要进行修改。

for (int i = 0; i < num_strs; i++) { /* for each string... */
  int len = strlen(sep_str[i]);        /* get length */
  int n = len % 4;                     /* (4 - n) = # of bytes of padding */
  switch (n) {                         /* print leading padding */
    case 1: fputs("00000000",stdout);    /* because of case fall-through, we print */
    case 2: fputs("00000000",stdout);    /*  8 '0's up to 3 times, depending on the */
    case 3: fputs("00000000",stdout);    /*  amount of padding needed */
  }
  for (int j = 0; j < len; j++) {      /* For each char up to len... */
    for (int k = 0x80; k; k >>=1) {      /* For each bit (k has the tested bit set) */
                                           /* print 1 if bit set in char, or 0 */
      putchar(((unsigned char)(sep_str[i][j]) & k) ? '1' : '0');
    }
    if (!(++n % 4))                      /* If multiple of 4 bytes written... */ 
      putchar('\n');                       /* ..add a linefeed */
  }
}