ASCII для двоичного представления (Big Endian) - PullRequest
0 голосов
/ 26 октября 2011

Я пишу функцию, которая преобразует строку ascii в ее двоичное представление с прямым порядком байтов.

Вот мой код:

    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 -> 1000000.Я хочу записать это как 00000000000000000000000001000000, и каждое 32-разрядное двоичное число должно быть в отдельной строке.Что бы я изменил в своем коде?

Я попытался изменить внешний вид for k, чтобы начать с 32, но это, очевидно, не сработало ...

Ответы [ 3 ]

0 голосов
/ 26 октября 2011

Все, что вам нужно сделать, это добавить 24 0 перед каждым байтом.Одним из способов было бы на самом деле пройти все 32 бита, но проверять только 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');
    }
}
0 голосов
/ 26 октября 2011

Предполагая следующее:

  • sep_str - это массив строк с нулевым символом в конце
  • вы хотите, чтобы 4-байтовые группы печатались как 32-битные (вместо 1 байта с24 дополнительных нуля впереди)
  • Вы хотите заполнение в начале , а не в конце

.. тогда вы можете взглянуть на следующее.Если какое-либо из этих предположений неверно, есть много комментариев, и вы сможете изменить их по мере необходимости.

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 */
  }
}
0 голосов
/ 26 октября 2011
printf("0000000000000000000000000"); // 25 zeros, leaving 7 bits for ASCII
for (int k = 6; k >= 0; k--) {
    putchar((c & (1 << k)) ? '1' : '0');
}
putchar('\n');
...