You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C++如何按结构体字段顺序打印十六进制值?

问题描述

我尝试迭代打印结构体的十六进制值,但由于循环遍历结构体的方式,打印顺序被打乱。示例代码如下:

#include <iostream>
struct Test {
    uint16_t t;
};

int main() {
    Test t = Test();
    unsigned char *ptr = (unsigned char *) &t;
    t.t = 16468;
    
    for (size_t i = 0; i < sizeof(t); i++) {
        printf("%02X", ptr[i]);
    }

    return 0;
}

控制台输出为5440,但结构体字段t的实际值对应的十六进制应该是4054(16468转十六进制为0x4054),这是由**字节序(小端模式)**导致的——当前代码按内存存储的字节顺序打印,而小端系统中低字节存在低地址,所以先输出了0x54,再输出0x40。

需要解决的问题:如何循环遍历结构体并按字段原有数值的高位到低位顺序打印其值?

解决方案

以下是几种可靠的实现方式:

方式1:转换为大端字节序后输出

针对固定类型的字段,可使用标准库的字节序转换函数(如htons,需包含对应平台头文件),将主机字节序转为网络字节序(大端)后再逐字节打印:

#include <iostream>
#include <arpa/inet.h> // 跨平台需注意兼容性,Windows可使用Winsock相关头文件

struct Test {
    uint16_t t;
};

int main() {
    Test t{};
    t.t = 16468;
    
    uint16_t big_endian_t = htons(t.t);
    unsigned char* ptr = reinterpret_cast<unsigned char*>(&big_endian_t);
    for (size_t i = 0; i < sizeof(big_endian_t); i++) {
        printf("%02X", ptr[i]);
    }

    return 0;
}

输出结果为4054,符合预期。

方式2:从高位字节开始遍历字段

如果需要更通用的处理逻辑,可以针对每个字段,从高位字节开始反向遍历内存:

#include <iostream>
#include <cstdint>

struct Test {
    uint16_t t;
};

// 通用模板函数:按数值高位到低位打印任意整数类型的十六进制
template<typename T>
void print_hex_be(const T& value) {
    const unsigned char* ptr = reinterpret_cast<const unsigned char*>(&value);
    // 从最高位字节开始遍历
    for (size_t i = sizeof(T); i > 0; i--) {
        printf("%02X", ptr[i-1]);
    }
}

int main() {
    Test t{};
    t.t = 16468;
    
    print_hex_be(t.t);

    return 0;
}

该模板函数适用于所有整数类型,无需关心平台字节序。

方式3:直接格式化输出数值

如果不需要逐字节操作,最简单的方式是直接用格式化字符串打印数值的十六进制:

#include <iostream>
struct Test {
    uint16_t t;
};

int main() {
    Test t{};
    t.t = 16468;
    
    // 按十六进制格式打印,自动按数值高位到低位输出
    printf("%04X", t.t);

    return 0;
}

输出结果同样为4054,这种方式最简洁,适合无需逐字节处理的场景。

内容的提问来源于stack exchange,提问作者Anonymous

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.02 17:19:53