我在尝试将char
变量设置为十六进制值时遇到问题。
我正在尝试实现一种打印功能,在该功能上打印结构的对齐方式。 “ aa”应该表示填充,但是我似乎无法在默认构造函数中设置变量。
输出
0x00: 00 00 00 00
0x04: 00 aa aa aa
。h文件
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 )));
}
}
}
主要
A *pa = new A;
Pa传递给函数
Print
功能存在一些问题。有些是“公正的”风格,但它们使解决实际问题变得更加困难。 (此外,您跳到了结论,可能使您对真正的问题视而不见。)首先,尝试解释为什么该行
printf(" %.2x", (*((unsigned char*)data+j )));
只是因为i
和d
发生了变化,所以应该做一些不同的事情。这些变量均不在此行中,因此在外循环的每次迭代中您都获得相同的输出。问题不在于数据设置,而在于读取数据。对于输出的每一行,当您打算打印接下来的四个字节时,您将打印数据的前四个字节。
解决此问题有点麻烦,因为您在此迭代的早期增加了d
。最好让d
在每次迭代中保持相同的值。您可以在迭代的末尾而不是在中间增加它,但是甚至更平滑也可能是使用d
而不是i
来控制循环。
最后,有一点鲁棒性:您的代码在增加4
时使用幻数d
,仅在sizeof(data)
为4时才有效。更好的方法是对该魔术值使用符号常量以确保一致性。我将其显式设置为4
,因为我不明白为什么指针的大小会影响所指向的数据的显示方式。
Alignment::Alignment::Print(void *data)
{
constexpr int BytesPerLine = 4; // could use sizeof(void *) instead of 4
for (int d = 0; d < 2*BytesPerLine; d += BytesPerLine) {
printf("\n0x%02x:", (d));
for (int j = 0; j < BytesPerLine; ++j)
{
printf(" %.2x", (*((unsigned char*)data + d + j))); // Add d here!
}
}
}