#include <stdio.h>
#include <string.h>
#include <ctype.h>
// 联合体定义,用于浮点数和字节数组之间的转换
typedef union {
float fdata;
unsigned long ldata;
} u_float_long_union;
// 函数声明
float hex_to_float(const char* hex_str);
int hex_string_to_bytes(const char* hex_str, unsigned char* bytes, int max_bytes);
unsigned char hex_char_to_byte(char c);
int main() {
char input[256];
printf("请输入16进制字节序列(例如: A1 92 61 C2 或 A19261C2):\n");
while(1) {
if(fgets(input
, sizeof(input
), stdin
) == NULL
) { break;
}
// 去除换行符
// 检查是否退出
if(strcmp(input
, "exit") == 0 || strcmp(input
, "quit") == 0) { break;
}
// 跳过空行
continue;
}
// 转换并显示结果
float result = hex_to_float(input);
printf("浮点数结果: %f\n\n", result
); }
return 0;
}
// 将16进制字符串转换为浮点数
float hex_to_float(const char* hex_str) {
unsigned char bytes[4];
int count = hex_string_to_bytes(hex_str, bytes, 4);
if(count != 4) {
printf("错误: 需要4个字节的数据,但只提供了%d个字节\n", count
); return 0.0f;
}
u_float_long_union converter;
converter.ldata = (unsigned long)bytes[0] |
((unsigned long)bytes[1] << 8) |
((unsigned long)bytes[2] << 16) |
((unsigned long)bytes[3] << 24);
return converter.fdata;
}
// 将16进制字符串转换为字节数组
int hex_string_to_bytes(const char* hex_str, unsigned char* bytes, int max_bytes) {
int count = 0;
int i = 0;
while(i < len && count < max_bytes) {
// 跳过空格
while(i
< len
&& isspace(hex_str
[i
])) { i++;
}
if(i >= len) {
break;
}
// 提取两个16进制字符
char high_nibble = hex_str[i++];
char low_nibble = (i < len) ? hex_str[i++] : '0';
// 如果下一个字符不是16进制数字,则跳过
low_nibble = '0';
i--; // 回退一个字符
}
// 转换并存储字节
bytes[count++] = (hex_char_to_byte(high_nibble) << 4) | hex_char_to_byte(low_nibble);
}
return count;
}
// 将16进制字符转换为对应的数值
unsigned char hex_char_to_byte(char c) {
if(c >= '0' && c <= '9') {
return c - '0';
}
if(c >= 'A' && c <= 'F') {
return c - 'A' + 10;
}
if(c >= 'a' && c <= 'f') {
return c - 'a' + 10;
}
return 0; // 非16进制字符返回0
}
I2luY2x1ZGUgPHN0ZGlvLmg+CiNpbmNsdWRlIDxzdHJpbmcuaD4KI2luY2x1ZGUgPGN0eXBlLmg+CgovLyDogZTlkIjkvZPlrprkuYnvvIznlKjkuo7mta7ngrnmlbDlkozlrZfoioLmlbDnu4TkuYvpl7TnmoTovazmjaIKdHlwZWRlZiB1bmlvbiB7CiAgICBmbG9hdCBmZGF0YTsKICAgIHVuc2lnbmVkIGxvbmcgbGRhdGE7Cn0gdV9mbG9hdF9sb25nX3VuaW9uOwoKLy8g5Ye95pWw5aOw5piOCmZsb2F0IGhleF90b19mbG9hdChjb25zdCBjaGFyKiBoZXhfc3RyKTsKaW50IGhleF9zdHJpbmdfdG9fYnl0ZXMoY29uc3QgY2hhciogaGV4X3N0ciwgdW5zaWduZWQgY2hhciogYnl0ZXMsIGludCBtYXhfYnl0ZXMpOwp1bnNpZ25lZCBjaGFyIGhleF9jaGFyX3RvX2J5dGUoY2hhciBjKTsKCmludCBtYWluKCkgewogICAgY2hhciBpbnB1dFsyNTZdOwogICAgCiAgICBwcmludGYoIjE26L+b5Yi26L2s5rWu54K55pWw6L2s5o2i5ZmoXG4iKTsKICAgIHByaW50Zigi6K+36L6T5YWlMTbov5vliLblrZfoioLluo/liJco5L6L5aaCOiBBMSA5MiA2MSBDMiDmiJYgQTE5MjYxQzIpOlxuIik7CiAgICAKICAgIHdoaWxlKDEpIHsKICAgICAgICBwcmludGYoIj4gIik7CiAgICAgICAgaWYoZmdldHMoaW5wdXQsIHNpemVvZihpbnB1dCksIHN0ZGluKSA9PSBOVUxMKSB7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KICAgICAgICAKICAgICAgICAvLyDljrvpmaTmjaLooYznrKYKICAgICAgICBpbnB1dFtzdHJjc3BuKGlucHV0LCAiXG4iKV0gPSAwOwogICAgICAgIAogICAgICAgIC8vIOajgOafpeaYr+WQpumAgOWHugogICAgICAgIGlmKHN0cmNtcChpbnB1dCwgImV4aXQiKSA9PSAwIHx8IHN0cmNtcChpbnB1dCwgInF1aXQiKSA9PSAwKSB7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KICAgICAgICAKICAgICAgICAvLyDot7Pov4fnqbrooYwKICAgICAgICBpZihzdHJsZW4oaW5wdXQpID09IDApIHsKICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgfQogICAgICAgIAogICAgICAgIC8vIOi9rOaNouW5tuaYvuekuue7k+aenAogICAgICAgIGZsb2F0IHJlc3VsdCA9IGhleF90b19mbG9hdChpbnB1dCk7CiAgICAgICAgcHJpbnRmKCLmta7ngrnmlbDnu5Pmnpw6ICVmXG5cbiIsIHJlc3VsdCk7CiAgICB9CiAgICAKICAgIHByaW50Zigi56iL5bqP57uT5p2fXG4iKTsKICAgIHJldHVybiAwOwp9CgovLyDlsIYxNui/m+WItuWtl+espuS4sui9rOaNouS4uua1rueCueaVsApmbG9hdCBoZXhfdG9fZmxvYXQoY29uc3QgY2hhciogaGV4X3N0cikgewogICAgdW5zaWduZWQgY2hhciBieXRlc1s0XTsKICAgIGludCBjb3VudCA9IGhleF9zdHJpbmdfdG9fYnl0ZXMoaGV4X3N0ciwgYnl0ZXMsIDQpOwogICAgCiAgICBpZihjb3VudCAhPSA0KSB7CiAgICAgICAgcHJpbnRmKCLplJnor686IOmcgOimgTTkuKrlrZfoioLnmoTmlbDmja7vvIzkvYblj6rmj5DkvpvkuoYlZOS4quWtl+iKglxuIiwgY291bnQpOwogICAgICAgIHJldHVybiAwLjBmOwogICAgfQogICAgCiAgICB1X2Zsb2F0X2xvbmdfdW5pb24gY29udmVydGVyOwogICAgY29udmVydGVyLmxkYXRhID0gKHVuc2lnbmVkIGxvbmcpYnl0ZXNbMF0gfCAKICAgICAgICAgICAgICAgICAgICAgKCh1bnNpZ25lZCBsb25nKWJ5dGVzWzFdIDw8IDgpIHwKICAgICAgICAgICAgICAgICAgICAgKCh1bnNpZ25lZCBsb25nKWJ5dGVzWzJdIDw8IDE2KSB8CiAgICAgICAgICAgICAgICAgICAgICgodW5zaWduZWQgbG9uZylieXRlc1szXSA8PCAyNCk7CiAgICAKICAgIHJldHVybiBjb252ZXJ0ZXIuZmRhdGE7Cn0KCi8vIOWwhjE26L+b5Yi25a2X56ym5Liy6L2s5o2i5Li65a2X6IqC5pWw57uECmludCBoZXhfc3RyaW5nX3RvX2J5dGVzKGNvbnN0IGNoYXIqIGhleF9zdHIsIHVuc2lnbmVkIGNoYXIqIGJ5dGVzLCBpbnQgbWF4X2J5dGVzKSB7CiAgICBpbnQgY291bnQgPSAwOwogICAgaW50IGkgPSAwOwogICAgaW50IGxlbiA9IHN0cmxlbihoZXhfc3RyKTsKICAgIAogICAgd2hpbGUoaSA8IGxlbiAmJiBjb3VudCA8IG1heF9ieXRlcykgewogICAgICAgIC8vIOi3s+i/h+epuuagvAogICAgICAgIHdoaWxlKGkgPCBsZW4gJiYgaXNzcGFjZShoZXhfc3RyW2ldKSkgewogICAgICAgICAgICBpKys7CiAgICAgICAgfQogICAgICAgIAogICAgICAgIGlmKGkgPj0gbGVuKSB7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KICAgICAgICAKICAgICAgICAvLyDmj5Dlj5bkuKTkuKoxNui/m+WItuWtl+espgogICAgICAgIGNoYXIgaGlnaF9uaWJibGUgPSBoZXhfc3RyW2krK107CiAgICAgICAgY2hhciBsb3dfbmliYmxlID0gKGkgPCBsZW4pID8gaGV4X3N0cltpKytdIDogJzAnOwogICAgICAgIAogICAgICAgIC8vIOWmguaenOS4i+S4gOS4quWtl+espuS4jeaYrzE26L+b5Yi25pWw5a2X77yM5YiZ6Lez6L+HCiAgICAgICAgaWYoIWlzeGRpZ2l0KGxvd19uaWJibGUpKSB7CiAgICAgICAgICAgIGxvd19uaWJibGUgPSAnMCc7CiAgICAgICAgICAgIGktLTsgLy8g5Zue6YCA5LiA5Liq5a2X56ymCiAgICAgICAgfQogICAgICAgIAogICAgICAgIC8vIOi9rOaNouW5tuWtmOWCqOWtl+iKggogICAgICAgIGJ5dGVzW2NvdW50KytdID0gKGhleF9jaGFyX3RvX2J5dGUoaGlnaF9uaWJibGUpIDw8IDQpIHwgaGV4X2NoYXJfdG9fYnl0ZShsb3dfbmliYmxlKTsKICAgIH0KICAgIAogICAgcmV0dXJuIGNvdW50Owp9CgovLyDlsIYxNui/m+WItuWtl+espui9rOaNouS4uuWvueW6lOeahOaVsOWAvAp1bnNpZ25lZCBjaGFyIGhleF9jaGFyX3RvX2J5dGUoY2hhciBjKSB7CiAgICBpZihjID49ICcwJyAmJiBjIDw9ICc5JykgewogICAgICAgIHJldHVybiBjIC0gJzAnOwogICAgfQogICAgaWYoYyA+PSAnQScgJiYgYyA8PSAnRicpIHsKICAgICAgICByZXR1cm4gYyAtICdBJyArIDEwOwogICAgfQogICAgaWYoYyA+PSAnYScgJiYgYyA8PSAnZicpIHsKICAgICAgICByZXR1cm4gYyAtICdhJyArIDEwOwogICAgfQogICAgcmV0dXJuIDA7IC8vIOmdnjE26L+b5Yi25a2X56ym6L+U5ZueMAp9