将十六进制值设置为用于填充的字符变量时出现问题

Issues setting a hexadecimal value to a char variable for padding

本文关键字:字符变量 问题 填充 十六进制 设置 用于      更新时间:2023-10-16

我在尝试将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 被传递到函数中

我的输出

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

您的Print函数存在一些问题。有些是"只是"风格,但它们使解决真正的问题变得更加困难。(此外,你妄下结论,可能会让你对真正的问题视而不见。首先,尝试解释为什么这条线

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

应该做一些不同的事情,只是因为id改变了。这两个变量都不在此行中,因此每次迭代外部循环都会获得相同的输出。问题不在于数据的设置,而在于数据的读取。对于每行输出,当您打算打印接下来的四个字节时,可以打印前四个字节的数据。

若要获取接下来的四个字节,需要向指针添加d,但这有问题,因为在此迭代的前面增加了d。最好是让d每次迭代中保持相同的值。您可以在迭代结束时而不是中间增加它,但更流畅的可能是使用d来控制循环而不是i.

最后,一点健壮性:您的代码在增加d时使用幻数4,这仅在sizeof(data)为 4 时才有效。脆弱。最好是对此魔术值使用符号常量以确保一致性。我将它显式设置为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!
}
}
}