#include <stdio.h>
#include <string.h>
#include <ctype.h>
// 将十六进制字符转换为对应的数值
int hex_char_to_int(char c)
{
if (c >= '0' && c <= '9') {
return c - '0';
} else if (c >= 'a' && c <= 'f') {
return c - 'a' + 10;
} else if (c >= 'A' && c <= 'F') {
return c - 'A' + 10;
}
return -1;
}
// 函数将十六进制字符串恢复成十六进制数据,并返回恢复后数据的长度
int hex_string_to_data(const char *hex_string, unsigned char *data) {
int hex_length = strlen(hex_string);
if (hex_length % 2 != 0) {
// 十六进制字符串长度必须为偶数
return -1;
}
int data_index = 0;
for (int i = 0; i < hex_length; i += 2) {
int high_nibble = hex_char_to_int(hex_string[i]);
int low_nibble = hex_char_to_int(hex_string[i + 1]);
if (high_nibble == -1 || low_nibble == -1) {
// 包含非十六进制字符
return -1;
}
// 组合高低半字节得到一个字节
data[data_index++] = (high_nibble << 4) | low_nibble;
}
return data_index;
}
int main() {
const char *hex_string = "363838323238326433313461653936616530633338366436aabbccfc";
unsigned char data[100];
int data_length = hex_string_to_data(hex_string, data);
if (data_length == -1) {
printf("输入的十六进制字符串格式错误。\n");
} else {
printf("恢复后数据的长度: %d\n", data_length);
printf("恢复后的数据: ");
for (int i = 0; i < data_length; i++) {
printf("%02x ", data[i]);
}
printf("\n");
}
return 0;
}