结构对齐/字节序检查

时间:2014-06-10 16:04:05

标签: c++ structure

我有这种C结构。

struct uart_buff
{
    uart_buff(uint32_t reg_Addr, uint32_t uValue)
    {
        addr=reg_Addr;
        data=uValue;
        terminator=0xFF;
    }
    uint32_t addr;
    uint32_t data;
    uint8_t terminator;
};

我打算打印这个结构的每个字节(如果我是右边的9个)(作为十六进制值),以检查语法是否正确。有没有一种简单的方法来做这样的事情?

2 个答案:

答案 0 :(得分:3)

是的,您可以通过unsigned char指针

访问该结构
struct uart_buff buf = ...;
unsigned char *p = (unsigned char *)&buf;
size_t i;

for(i = 0; i < sizeof buf; i++) {
 printf("%02X ", p[i]);
}

答案 1 :(得分:0)

我有一个我通常用于此类的模板类 事情:

template<typename T>
class Dump
{
    unsigned char const*myObj;
public:
    explicit            Dump( T const& obj )
    :   myObj( reinterpret_cast<unsigned char const*>( &obj ) )
    {
    }
    friend std::ostream& operator<<( std::ostream& dest, Dump const& obj )
    {
        IOSave              saver( dest ) ;
        dest.fill( '0' ) ;
        dest.setf( std::ios::hex, std::ios::basefield ) ;
        char const*         baseStr = "" ;
        if ( (dest.flags() & std::ios::showbase) != 0 ) {
            baseStr = "0x" ;
        }
        unsigned char const* const
                            end = obj.myObj + sizeof( T ) ;
        for ( unsigned char const* p = myObj ; p != end ; ++ p ) {
            if ( p != myObj ) {
                dest << ' ' ;
            }
            dest << baseStr << std::setw( 2 ) << (unsigned int)( *p ) ;
        }
    }
} ;

template< typename T >
inline Dump< T >
dump(
    T const&            obj )
{
    return Dump< T >( obj ) ;
}

IOSave只是保存和恢复的常用类 在要修改参数时格式化参数。)

这允许转储几乎任何东西的十六进制图像 写作:

std::cout << dump( myObj ) << std::endl;