Распечатка значений байта структуры за байтом - PullRequest
0 голосов
/ 21 января 2019

По сути, я пытаюсь привести массив символов к указателю на структуру и распечатать значения в структуре побайтно.Это связано с тем, что какой-то устаревший код, с которым я имею дело, использует макрос для выполнения побитового сдвига и маскирования, чтобы изменить 4 бита внутри целого числа в структуре, и я пытаюсь выяснить, работает ли макрос так, как задумано.Тем не менее, я сжал свою проблему в этом игрушечном примере -

#include <stdio.h>
#include <stdint.h>

int main()
{
    struct student
    {
        int32_t hi;
        int8_t test
    };

    struct student p1 = {20, 20};

    for(int i = 0; i < sizeof(p1); i++)
    {
        printf("%c",((char*)&p1)[i]);
    }
    return 0;
}

. По какой-то причине, это печатает два символа (которые отображаются в виде прямоугольников с 0014 в них) и ничего больше.Если я изменю цикл for на 0 - 5 (что примерно соответствует ожидаемым значениям цикла for), я получу точно такой же результат.Есть ли способ сделать то, что я хочу (т.е. заставить это распечатать 5 символов)?Я знаю, что некоторые персонажи будут просто пробелами, но я не понимаю, как я не получаю эти пробелы.

Ответы [ 2 ]

0 голосов
/ 21 января 2019

Подробнее о ASCII .Некоторые символы являются управляющими символами , поэтому они отображаются некорректно, и ваша система может иметь странную кодировку символов .Помните, что в 2019 году UTF-8 используется повсеместно (почти).

Вам лучше будет печатать свои байты в шестнадцатеричном формате:

  printf("%02x",(unsigned int) ((char*)&p1)[i]);

, и вы можетеиметь реализацию со знаком char -s, так что может быть лучше заменить char* явным unsigned char* (или даже лучше uint8_t* из <stdint.h>).Обратите внимание, что задокументировано, что printf с %02x хочет целое число без знака (а не просто char).Что-нибудь еще может быть неопределенное поведение .

Обратитесь хотя бы к какому-нибудь C эталонному сайту и рассмотрите возможность изучения стандарта C11 n1570 .

Конечно, включите все предупреждения и отладочную информацию в вашем компиляторе (с GCC , скомпилируйте с gcc -Wall -Wextra -g) и используйте отладчик (например, use gdb).Так что читайте Как отлаживать небольшие программы .

0 голосов
/ 21 января 2019

Вы пытаетесь распечатать двоичные значения в виде символов. Способ печати этих символов зависит от вашей консоли, но байтовые значения 0 обычно ничего не печатают.

Если вы хотите увидеть значения байтов, выведите вместо них шестнадцатеричные числа:

printf("%02x ",((char*)&p1)[i]);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...