Проблемы с установкой шестнадцатеричного значения переменной char для заполнения - PullRequest
0 голосов
/ 25 января 2020

У меня возникают проблемы при попытке установить переменную char в шестнадцатеричное значение.

Я пытаюсь реализовать функцию печати, в которой я печатаю выравнивание структуры. Предполагается, что «aa» представляет заполнение, но я не могу установить переменную в конструкторе по умолчанию.

Вывести, что это должен быть

0x00: 00 00 00 00      
0x04: 00 aa aa aa 

.h file

struct A
{
    int  a0;
    char a1;
    char pad0;
    char pad1;
    char pad2;
    A() {
        a0 = 0;
        a1 = 0;
        pad1 = 0xAA;
        pad2 = 0xAA;
    }
};

. cpp


Alignment::Alignment:Print(void *data)  
{
    int d {0 };
    for (int i = 0; i <2; ++i) {
        printf("\n0x%02x:", (d));
        d = d + 4;
        for (int j = 0; j < sizeof(data); ++j)
        {
            printf(" %.2x", (*((unsigned char*)data+j )));
        }
     }

}

Main

A *pa = new A;

Па передается в функцию

Мой выход

0x00: 00 00 00 00
0x04: 00 00 00 00

1 Ответ

0 голосов
/ 25 января 2020

Есть несколько проблем с вашей функцией Print. Некоторые из них «просто» стиль, но они затрудняют решение реальной проблемы. (Кроме того, вы сделали поспешные выводы, возможно, ослепив вас к реальной проблеме.) Прежде всего, попробуйте объяснить, почему строка

            printf(" %.2x", (*((unsigned char*)data+j )));

должна делать что-то другое только потому, что i и d изменилось. Ни одна из этих переменных не находится в этой строке, поэтому вы получаете одинаковые выходные данные с каждой итерацией внешнего l oop. Проблема не в настройке данных, а в их чтении. Для каждой строки вывода вы печатаете первые четыре байта данных, когда вы намеревались напечатать следующие четыре байта.

Чтобы получить следующие четыре байта, вам нужно добавить d к указателю, но это проблематично c, потому что вы увеличили d ранее в этой итерации. Лучше было бы, чтобы d сохранял одно и то же значение на каждой итерации. Вы можете увеличить его в конце итерации вместо середины, но даже более плавным может быть использование d для управления l oop вместо i.

Наконец, немного надежности : ваш код использует магическое число c 4 при увеличении d, которое работает, только если sizeof(data) равно 4. Fr agile. Лучше было бы использовать константу symboli c для этого значения magi c, чтобы обеспечить согласованность. Я установлю это явно на 4, так как не понимаю, почему размер указателя должен влиять на отображение данных, на которые указывают ссылки.

Alignment::Alignment::Print(void *data)  
{
    constexpr int BytesPerLine = 4; // could use sizeof(void *) instead of 4
    const unsigned char * bytes = static_cast<unsigned char*>(data); // Taking the conversion out of the loop.

    for (int d = 0; d < 2*BytesPerLine; d += BytesPerLine) {
        printf("\n0x%02x:", (d));
        for (int j = 0; j < BytesPerLine; ++j)
        {
            printf(" %.2x", *(bytes + d + j)); // Add d here!
        }
     }
}
...