Есть несколько проблем с вашей функцией 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!
}
}
}