fork download
  1. #include <stdio.h>
  2. #include <string.h>
  3. #include <ctype.h>
  4.  
  5. // 联合体定义,用于浮点数和字节数组之间的转换
  6. typedef union {
  7. float fdata;
  8. unsigned long ldata;
  9. } u_float_long_union;
  10.  
  11. // 函数声明
  12. float hex_to_float(const char* hex_str);
  13. int hex_string_to_bytes(const char* hex_str, unsigned char* bytes, int max_bytes);
  14. unsigned char hex_char_to_byte(char c);
  15.  
  16. int main() {
  17. char input[256];
  18.  
  19. printf("16进制转浮点数转换器\n");
  20. printf("请输入16进制字节序列(例如: A1 92 61 C2 或 A19261C2):\n");
  21.  
  22. while(1) {
  23. printf("> ");
  24. if(fgets(input, sizeof(input), stdin) == NULL) {
  25. break;
  26. }
  27.  
  28. // 去除换行符
  29. input[strcspn(input, "\n")] = 0;
  30.  
  31. // 检查是否退出
  32. if(strcmp(input, "exit") == 0 || strcmp(input, "quit") == 0) {
  33. break;
  34. }
  35.  
  36. // 跳过空行
  37. if(strlen(input) == 0) {
  38. continue;
  39. }
  40.  
  41. // 转换并显示结果
  42. float result = hex_to_float(input);
  43. printf("浮点数结果: %f\n\n", result);
  44. }
  45.  
  46. printf("程序结束\n");
  47. return 0;
  48. }
  49.  
  50. // 将16进制字符串转换为浮点数
  51. float hex_to_float(const char* hex_str) {
  52. unsigned char bytes[4];
  53. int count = hex_string_to_bytes(hex_str, bytes, 4);
  54.  
  55. if(count != 4) {
  56. printf("错误: 需要4个字节的数据,但只提供了%d个字节\n", count);
  57. return 0.0f;
  58. }
  59.  
  60. u_float_long_union converter;
  61. converter.ldata = (unsigned long)bytes[0] |
  62. ((unsigned long)bytes[1] << 8) |
  63. ((unsigned long)bytes[2] << 16) |
  64. ((unsigned long)bytes[3] << 24);
  65.  
  66. return converter.fdata;
  67. }
  68.  
  69. // 将16进制字符串转换为字节数组
  70. int hex_string_to_bytes(const char* hex_str, unsigned char* bytes, int max_bytes) {
  71. int count = 0;
  72. int i = 0;
  73. int len = strlen(hex_str);
  74.  
  75. while(i < len && count < max_bytes) {
  76. // 跳过空格
  77. while(i < len && isspace(hex_str[i])) {
  78. i++;
  79. }
  80.  
  81. if(i >= len) {
  82. break;
  83. }
  84.  
  85. // 提取两个16进制字符
  86. char high_nibble = hex_str[i++];
  87. char low_nibble = (i < len) ? hex_str[i++] : '0';
  88.  
  89. // 如果下一个字符不是16进制数字,则跳过
  90. if(!isxdigit(low_nibble)) {
  91. low_nibble = '0';
  92. i--; // 回退一个字符
  93. }
  94.  
  95. // 转换并存储字节
  96. bytes[count++] = (hex_char_to_byte(high_nibble) << 4) | hex_char_to_byte(low_nibble);
  97. }
  98.  
  99. return count;
  100. }
  101.  
  102. // 将16进制字符转换为对应的数值
  103. unsigned char hex_char_to_byte(char c) {
  104. if(c >= '0' && c <= '9') {
  105. return c - '0';
  106. }
  107. if(c >= 'A' && c <= 'F') {
  108. return c - 'A' + 10;
  109. }
  110. if(c >= 'a' && c <= 'f') {
  111. return c - 'a' + 10;
  112. }
  113. return 0; // 非16进制字符返回0
  114. }
Success #stdin #stdout 0s 5320KB
stdin
48 43 2D 40
stdout
16进制转浮点数转换器
请输入16进制字节序列(例如: A1 92 61 C2 或 A19261C2):
> 浮点数结果: 2.707232

> 程序结束