将十六进制值设置为用于填充的char变量

问题描述 投票:-2回答:1

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

c++ database data-structures alignment padding
1个回答
0
投票

Print功能存在一些问题。有些是“公正的”风格,但它们使解决实际问题变得更加困难。 (此外,您跳到了结论,可能使您对真正的问题视而不见。)首先,尝试解释为什么该行

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

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

解决此问题有点麻烦,因为您在此迭代的早期增加了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!
        }
     }
}
© www.soinside.com 2019 - 2024. All rights reserved.