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

如何在C++中将ASCII字节数组转换为十六进制字节数组?

把ASCII字节数组转换为十六进制ASCII字节数组的C++实现

刚好我之前处理过类似的需求,本质上就是把每个8位字节拆解成高4位和低4位,分别映射到对应的十六进制字符(0-9、A-F)的ASCII值,然后填充到目标数组里。下面给你几种实用的实现方式:

基础数组实现(固定长度)

如果你用固定长度的数组,最直接的方式是写一个辅助函数来处理单个字节的转换,然后循环遍历源数组:

#include <cstdint>
#include <cstdio>

// 辅助函数:将单个字节转为两位十六进制ASCII字符,写入目标指针的前两个位置
void byteToHexAscii(uint8_t byte, uint8_t* dest) {
    // 定义大写十六进制字符集,每个字符本身就是对应的ASCII值
    const uint8_t hexChars[] = "0123456789ABCDEF";
    // 提取高4位,映射到字符集
    dest[0] = hexChars[(byte >> 4) & 0x0F];
    // 提取低4位,映射到字符集
    dest[1] = hexChars[byte & 0x0F];
}

int main() {
    // 源字节数组
    uint8_t source[3] = {0xB1, 0x8E, 0x9C};
    // 目标数组长度必须是源数组的2倍
    uint8_t destination[6] = {0};

    for (size_t i = 0; i < sizeof(source) / sizeof(source[0]); ++i) {
        byteToHexAscii(source[i], &destination[i * 2]);
    }

    // 打印验证结果
    printf("转换后的十六进制ASCII数组:");
    for (uint8_t b : destination) {
        printf("0x%02X ", b);
    }
    // 输出应为:0x42 0x31 0x38 0x45 0x39 0x43
    return 0;
}

关键细节说明

  • 用uint8_t代替自定义的Byte:这是C++标准库<cstdint>提供的无符号8位整数类型,跨平台兼容性更好,语义也更清晰。
  • 位操作的作用:(byte >> 4) & 0x0F把字节右移4位后,用0x0F掩码保留低4位,这就得到了高4位的数值(0-15);byte & 0x0F直接保留低4位的数值,两者都用来索引字符集数组,得到对应的ASCII字符。
  • 字符集选择:如果需要小写的十六进制字符(比如b、e),只需要把hexChars改成"0123456789abcdef"即可。

现代C++ vector实现(动态长度)

如果你的源数组长度不固定,用std::vector会更安全,避免数组越界的问题:

#include <cstdint>
#include <vector>
#include <cstdio>

std::vector<uint8_t> convertToHexAscii(const std::vector<uint8_t>& source) {
    std::vector<uint8_t> destination(source.size() * 2);
    const uint8_t hexChars[] = "0123456789ABCDEF";

    for (size_t i = 0; i < source.size(); ++i) {
        destination[i * 2] = hexChars[(source[i] >> 4) & 0x0F];
        destination[i * 2 + 1] = hexChars[source[i] & 0x0F];
    }

    return destination;
}

int main() {
    std::vector<uint8_t> source = {0xB1, 0x8E, 0x9C};
    auto destination = convertToHexAscii(source);

    printf("转换后的十六进制ASCII数组:");
    for (uint8_t b : destination) {
        printf("0x%02X ", b);
    }
    return 0;
}

这种方式不需要手动计算目标数组的长度,vector会自动管理内存,适合处理动态变化的输入。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 08:00:51