ASCII в двоичное представление (Big Endian)

#c #string #parsing #binary #endianness

#c #строка #синтаксический анализ #двоичный #порядковый номер

Вопрос:

Я пишу функцию, которая преобразует строку 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 amp; (1 << k)) ? '1' : '0');
                count  ;
            }

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

Я пытаюсь дополнить каждый символ до 32 бит. Так, например, пробел равен 0x20 —> 1000000 . Я хочу записать его как 00000000000000000000000001000000 и иметь каждое 32-разрядное двоичное число в отдельной строке. Что бы я изменил в своем коде?

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

Комментарии:

1. Ну, если у вас есть что-то, что печатает восемь битов, и вы хотите заполнить его нулем, очевидным способом было бы сначала напечатать двадцать четыре нуля. Затем, конечно, избавьтесь от всего, что связано с подсчетом, и всегда вводите новую строку. Это домашнее задание?

2. Пожалуйста, уточните значение ваших переменных. У вас есть num_strs строки, сохраненные в sep_str ? Каждый из них имеет длину 5 символов?

Ответ №1:

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

Ответ №2:

Все, что вам нужно сделать, это добавить 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 amp;amp; c amp; (1 << k)) ? '1' : '0');
        }
        putchar('n');
    }
}
  

Ответ №3:

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

  • 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]) amp; k) ? '1' : '0');
    }
    if (!(  n % 4))                      /* If multiple of 4 bytes written... */ 
      putchar('n');                       /* ..add a linefeed */
  }
}