#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 */
}
}