加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

如何从shell中的二进制文件中打印浮点值?

发布时间:2020-12-15 22:46:18 所属栏目:安全 来源:网络整理
导读:我的二进制文件包含双浮点(8字节)或浮点数(4字节),它是按以下方式生成的: $python -c $'from struct import packnwith open("file.bin","wb") as f: f.write(pack("d",0.123))'$xxd file.bin00000000: b072 6891 ed7c bf3f .rh..|.? 我可以通过以下方式从P
我的二进制文件包含双浮点(8字节)或浮点数(4字节),它是按以下方式生成的:

$python -c $'from struct import packnwith open("file.bin","wb") as f: f.write(pack("<d",0.123))'
$xxd file.bin
00000000: b072 6891 ed7c bf3f                      .rh..|.?

我可以通过以下方式从Python打印出来:

$python -c $'from struct import unpacknwith open("file.bin","rb") as f: print(unpack("<d",f.read(8)))'
(0.123,)

4字节浮点数相同,只需将< d转换为< f(稍后提到为float.bin). 如何使用更干净的方式从shell脚本中打印该值(不使用Python)?使用内置工具(例如printf)或广泛使用的外部工具(例如xxd,dc,bc,od,hexdump等). 例如,为了打印十进制值,我可以使用xxd(Vim的一部分),例如在Bash:
>获取第一个字节的值:

$echo $((16#$(xxd -ps -s0 -l1 file.bin)))
176

对于第二个和第四个字节,增加-s.
>从所有8个字节中获取十进制值:

$echo $((16#$(xxd -ps -s0 -l8 file.bin)))
-5732404399725297857

但是我想在Unix系列上打印原始浮动值(0.123).
理想情况下使用一些单行(以保持简单作为脚本的一部分),因此我可以将其分配到文本变量或在屏幕上打印值.

我试图使用printf(在4字节的浮点数上使其更简单),但它没有按预期工作:

$xxd -p float.bin
6de7fb3d
$printf "%.4fn" 0x.$(xxd -p float.bin)
0.4293
$printf "%.4fn" 0x3dfbe76d
1039918957.0000
$printf "%.4en" 0x3dfbe76d
1.0399e+09

根据这个on-line converter,0x3dfbe76d与0.123相同,所以十六进制值是反向的(xxd实际给出的值).

解决方法

这不使用Python,是一种广泛使用的外部工具,Perl.

perl -e "print pack('d>',0.123)" > file.bin

perl -e "print unpack('d>',<>)" < file.bin
0.123

或者你可以使用GNU od实用程序,例如:

od -tfD file.bin
0000000                    0.123
0000010

其中-t参数指定浮点数(f)的输出格式,后跟可选的大小说明符(F代表float,D代表double或L代表long double),简而言之-tfD可以替换为-e或-F.要仅打印不带地址的值,可以指定-A n.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读