如何在Shell中获取IEEE 754浮点数的十六进制表示
Shell环境下浮点数转十六进制HEX表示解决方案
前置说明
适用环境:仅预装sh、hexdump、bc工具的嵌入式Linux环境,无gdb、python、perl、bash、od等额外依赖。
可用实现方案
方案一:bc手动计算IEEE 754编码实现
bc本身支持浮点数运算,可通过脚本手动实现IEEE 754单精度/双精度浮点数编码逻辑,以下为单精度浮点数转HEX的可直接运行脚本:
float_to_hex() { local f=$1 # 以下为IEEE 754单精度编码逻辑,可按需修改为双精度 echo "scale=10; define abs(x) { if (x < 0) return -x; return x; } f = $f; sign = 0; if (f < 0) { sign = 1; f = -f; } if (f == 0) { print 0; quit; } e = 0; while (f >= 2) { f /= 2; e += 1; } while (f < 1) { f *= 2; e -= 1; } biased_e = e + 127; mantissa = (f - 1) * 2^23; hex = sign * 2^31 + biased_e * 2^23 + mantissa; obase=16; hex; " | bc } # 调用示例 float_to_hex 4.0
调用上述函数输入4.0即可得到输出40800000,符合单精度浮点数4.0的HEX编码结果。
方案二:结合hexdump的轻量实现
如果不需要手动实现编码逻辑,也可以通过输出浮点数原生二进制后调用hexdump转码,示例如下:
# 输出浮点数二进制流,通过hexdump转HEX printf "%f" 4.0 | hexdump -e '1/4 "%08x"'
注:如果需要调整大小端输出,可修改hexdump的格式化参数,例如小端输出可改为
-e '4/1 "%02x"'
备选方案
如果以上脚本方案适配性不足,可开发极简C工具实现,总代码量不足20行,嵌入式环境编译后开销极低:
#include <stdio.h> #include <stdint.h> #include <stdlib.h> int main(int argc, char** argv) { float f = atof(argv[1]); uint32_t hex = *(uint32_t*)&f; printf("%08x\n", hex); return 0; }
内容的提问来源于stack exchange,提问作者Tundy
相关产品推荐
相关产品推荐

