将十六进制值设置为用于填充的字符变量时出现问题
Issues setting a hexadecimal value to a char variable for padding
我在尝试将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 )));
应该做一些不同的事情,只是因为i
和d
改变了。这两个变量都不在此行中,因此每次迭代外部循环都会获得相同的输出。问题不在于数据的设置,而在于数据的读取。对于每行输出,当您打算打印接下来的四个字节时,可以打印前四个字节的数据。
若要获取接下来的四个字节,需要向指针添加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!
}
}
}
相关文章:
- 如何在保持其值的同时将 c++ 无符号字符变量转换为 char 变量
- 如何从字符串中找到字符(变量)?
- C++理解计算字符变量的问题
- 将十六进制值设置为用于填充的字符变量时出现问题
- 将字符串变量分配给无符号字符变量
- 当对字符变量使用toupper()时,所述char变量输出多个字符.我该如何防止这种情况发生
- C++ 多线程中的锁和条件变量问题
- C++grpc的一些变量问题
- C++程序,将整数输入转换为字符的问题
- C++无法打印字符变量
- C Unicode UTF-8解码字符的问题
- 我如何加载多个脚本而没有变量问题
- 如何查看两个字符变量是否相等
- 未初始化的变量问题C++
- 比较两个字符的问题
- C++ 奇怪的字符*参数问题(不兼容的类型)
- 如果语句未正确读取字符变量
- 使用CIN和COUT时,字符变量无法正确打印
- C++中宽字符的问题
- C++新字符[]的问题