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

如何将十六进制格式字符串转换为unsigned char*缓冲区?

正确的十六进制字符串转unsigned char*缓冲区方法

你当前的强转方式完全不符合需求——直接(unsigned char*)data只是把字符串里每个字符的ASCII值(比如'A'是0x41,'1'是0x31)单独作为缓冲区的字节,而不是把"A1"解析成0xA1这个单字节值。下面是正确的实现步骤和代码:

核心思路

原字符串是十六进制字符对格式,每两个字符对应一个字节。需要逐个解析每一组字符,将其转换为对应的十六进制数值,存入unsigned char缓冲区。

实现代码

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

// 辅助函数:将单个十六进制字符转成数值
static int hex_char_to_val(char c) {
    if (isdigit(c)) return c - '0';
    c = toupper(c);
    if (c >= 'A' && c <= 'F') return 10 + (c - 'A');
    return -1; // 非法字符
}

unsigned char* hex_str_to_buffer(const char* hex_str, size_t* out_len) {
    if (!hex_str || !out_len) return NULL;
    
    size_t str_len = strlen(hex_str);
    // 十六进制字符串长度必须是偶数,否则无法两两分组
    if (str_len % 2 != 0) {
        *out_len = 0;
        return NULL;
    }
    
    *out_len = str_len / 2;
    unsigned char* buffer = malloc(*out_len);
    if (!buffer) {
        *out_len = 0;
        return NULL;
    }
    
    for (size_t i = 0; i < *out_len; i++) {
        int high = hex_char_to_val(hex_str[2*i]);
        int low = hex_char_to_val(hex_str[2*i + 1]);
        if (high == -1 || low == -1) {
            free(buffer);
            *out_len = 0;
            return NULL;
        }
        buffer[i] = (high << 4) | low;
    }
    
    return buffer;
}

// 使用示例
int main() {
    char* data = "A1B2C3D4E5F6A7B8";
    size_t buf_len;
    unsigned char* buffer = hex_str_to_buffer(data, &buf_len);
    
    if (buffer && buf_len == 8) {
        // 调用你的内存写入函数(注意修正原函数的语法错误)
        abc(0x12345678, buffer, buf_len);
        // 用完释放内存
        free(buffer);
    }
    
    return 0;
}

关键说明

  • 先检查输入字符串长度是否为偶数,避免解析到不完整的十六进制组
  • 辅助函数hex_char_to_val处理大小写十六进制字符,返回对应的0-15数值
  • 每组两个字符:高位左移4位,和低位按位或,得到单字节的十六进制值
  • 动态分配的缓冲区使用完必须用free释放,避免内存泄漏
  • 如果你的场景不需要动态分配,也可以用静态数组(比如unsigned char buffer[8];),但要确保数组长度足够

写入函数语法修正

原函数声明int abc(uint64_t address, buffer, uint32_t lenght);存在语法错误,正确的声明应为:

int abc(uint64_t address, unsigned char* buffer, uint32_t length);

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 18:31:16