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

如何在C语言中将十进制字符值转为空格分隔的十六进制字符串?

我明白你现在的需求——把每个字符的最终十进制值转成两位十六进制字符串,再用空格连起来返回。之前用sprintf()踩坑太正常了,大概率是缓冲区处理或者格式符用错了,我给你几个靠谱的实现思路:

方案1:动态分配缓冲区 + snprintf(推荐生产环境用)

因为要拼接多个十六进制值,首先得算准需要的缓冲区大小:每个字符对应2位十六进制+1个分隔空格(最后一个字符不用空格),所以总长度是 3 * 字符数 - 1,再额外加1位存字符串结束符\0。

代码示例:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

char* decimal_to_hex_string(int* decimal_values, int count) {
    // 计算缓冲区总大小,预留结束符位置
    int buffer_size = 3 * count - 1 + 1;
    char* result = malloc(buffer_size);
    if (!result) {
        return NULL; // 内存分配失败的容错处理
    }
    result[0] = '\0'; // 先初始化空字符串
    
    for (int i = 0; i < count; i++) {
        int val = decimal_values[i];
        // 确保是单字节字符范围(0-255),如果是宽字符需要调整逻辑
        if (val < 0 || val > 255) {
            free(result);
            return NULL; // 非法值处理,也可以换成跳过该字符
        }
        // 第一个字符直接写入,后续先加空格再写十六进制
        if (i == 0) {
            snprintf(result, buffer_size, "%02X", val);
        } else {
            // 计算剩余可写入的长度,避免溢出
            int remaining = buffer_size - strlen(result);
            snprintf(result + strlen(result), remaining, " %02X", val);
        }
    }
    return result;
}

几个关键细节:

  • 用%02X保证输出两位十六进制,比如十进制10会变成0A而不是A,符合密码学场景的规范
  • snprintf比sprintf安全太多,它会严格限制写入长度,不会出现缓冲区溢出搞崩程序的情况
  • 动态分配的内存,调用完这个函数后记得用free()释放,避免内存泄漏
方案2:固定缓冲区(适合字符数量已知的场景)

如果提前知道最多处理多少字符,比如加密程序固定处理16字节,那可以用固定大小的数组,省去内存分配的麻烦:

#include <stdio.h>
#include <string.h>

#define MAX_CHAR_COUNT 16
#define OUTPUT_BUFFER_SIZE 3 * MAX_CHAR_COUNT // 每个字符占3位(2位十六进制+1空格)

void decimal_to_hex_fixed(int* decimal_values, int count, char* output) {
    if (count > MAX_CHAR_COUNT) {
        output[0] = '\0';
        return; // 超出最大处理数的容错
    }
    output[0] = '\0';
    for (int i = 0; i < count; i++) {
        int val = decimal_values[i];
        if (i == 0) {
            snprintf(output, OUTPUT_BUFFER_SIZE, "%02X", val);
        } else {
            int remaining = OUTPUT_BUFFER_SIZE - strlen(output);
            snprintf(output + strlen(output), remaining, " %02X", val);
        }
    }
}
你之前用sprintf踩坑的常见原因
  • 缓冲区太小:没算准需要的长度,导致写入溢出,破坏其他内存数据
  • 格式符错误:比如用了%x没加02,输出的十六进制位数不统一;或者类型不匹配,比如传入了超出范围的值
  • 未初始化字符串:拼接前没把缓冲区设为空,导致开头出现乱码

内容的提问来源于stack exchange,提问作者Samuel Gregorovič

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 10:24:01