如何将十六进制格式字符串转换为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
相关产品推荐
相关产品推荐

