方法1:逐个字符转换为十六进制(推荐)
这种方法适用于将字符串中的每个字符转换为对应的十六进制表示(ASCII码的十六进制形式)。

(图片来源网络,侵删)
代码示例:
#include <stdio.h>
#include <string.h>
void string_to_hex(const char *str, char *hex_str) {
int i;
for (i = 0; str[i] != '\0'; i++) {
sprintf(&hex_str[i * 2], "%02X", (unsigned char)str[i]);
}
hex_str[i * 2] = '\0'; // 添加字符串结束符
}
int main() {
const char *input_str = "Hello";
char hex_output[2 * strlen(input_str) + 1]; // 每个字符2个十六进制位 + '\0'
string_to_hex(input_str, hex_output);
printf("Original: %s\n", input_str);
printf("Hex: %s\n", hex_output);
return 0;
}
输出:
Original: Hello
Hex: 48656C6C6F
说明:
sprintf用于将每个字符的ASCII码格式化为两位十六进制(%02X)。(unsigned char)确保字符被正确解释为无符号值,避免符号扩展问题。hex_str的大小需要是输入字符串长度的2倍(每个字符2个十六进制位)加上1(\0)。
方法2:将整个字符串视为字节数组转换为十六进制
如果字符串是二进制数据的文本形式(如 "48656C6C6F"),可以直接将其转换为十六进制字节流。
代码示例:
#include <stdio.h>
#include <string.h>
void hex_to_string(const char *hex_str, char *output) {
int len = strlen(hex_str);
for (int i = 0; i < len; i += 2) {
sscanf(&hex_str[i], "%2hhx", &output[i / 2]);
}
output[len / 2] = '\0';
}
int main() {
const char *hex_str = "48656C6C6F";
char output[strlen(hex_str) / 2 + 1];
hex_to_string(hex_str, output);
printf("Hex: %s\n", hex_str);
printf("String: %s\n", output);
return 0;
}
输出:
Hex: 48656C6C6F
String: Hello
说明:
sscanf从十六进制字符串中解析每个字节(%2hhx)。- 输出字符串的长度是输入十六进制字符串长度的一半(每两个字符表示一个字节)。
方法3:使用位操作手动转换
如果不希望依赖 sprintf 或 sscanf,可以手动实现转换逻辑。
代码示例:
#include <stdio.h>
char char_to_hex(char c) {
if (c >= 0 && c <= 9) return c + '0';
else return c - 10 + 'A';
}
void string_to_hex_manual(const char *str, char *hex_str) {
int i;
for (i = 0; str[i] != '\0'; i++) {
unsigned char byte = str[i];
hex_str[i * 2] = char_to_hex(byte / 16);
hex_str[i * 2 + 1] = char_to_hex(byte % 16);
}
hex_str[i * 2] = '\0';
}
int main() {
const char *input_str = "Hello";
char hex_output[2 * strlen(input_str) + 1];
string_to_hex_manual(input_str, hex_output);
printf("Original: %s\n", input_str);
printf("Hex: %s\n", hex_output);
return 0;
}
输出:
Original: Hello
Hex: 48656C6C6F
说明:
char_to_hex将0-15的值转换为十六进制字符('0'-'9'或'A'-'F')。- 通过除法和取模运算分离高4位和低4位,分别转换为两个十六进制字符。
| 方法 | 适用场景 | 优点 | 缺点 |
|---|---|---|---|
方法1(sprintf) |
将字符串的ASCII码转为十六进制 | 简单直接 | 依赖标准库函数 |
方法2(sscanf) |
将十六进制字符串转为原始字符串 | 适合解析十六进制数据 | 输入必须是合法的十六进制 |
| 方法3(手动转换) | 需要避免标准库函数时 | 灵活,无依赖 | 代码稍复杂 |
根据需求选择合适的方法,如果只是简单转换,方法1是最推荐的。

(图片来源网络,侵删)
