gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 16:58:54 26 4
gpt4 key购买 nike

我有包含双浮点数(8 个字节)或仅浮点数(4 个字节)值的二进制文件,其生成方式如下:

$ python -c $'from struct import pack\nwith 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 unpack\nwith open("file.bin", "rb") as f: print(unpack("<d", f.read(8)))'
(0.123,)

4 字节浮点数也一样,只是将 <d 改为 <f(后文称为 float.bin)。

如何使用更简洁的方式(不使用 Python)从 shell 脚本打印该值?使用内置工具(例如 printf ),或广泛使用的外部工具(例如 xxddcbcod 、 5 67x10 )。

例如打印十进制值,我可以使用 hexdump(Vim 的一部分),例如在 Bash 中:
  • 获取第一个字节的值:
    $ echo $((16#$(xxd -ps -s0 -l1 file.bin)))
    176

    对于第二个和第四个字节,增加 xxd
  • 从所有 8 个字节中获取十进制值:
    $ echo $((16#$(xxd -ps -s0 -l8 file.bin)))
    -5732404399725297857

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

    我尝试使用 0.123(在 4 字节浮点数上使其更简单),但它没有按预期工作:
    $ xxd -p float.bin
    6de7fb3d
    $ printf "%.4f\n" 0x.$(xxd -p float.bin)
    0.4293
    $ printf "%.4f\n" 0x3dfbe76d
    1039918957.0000
    $ printf "%.4e\n" 0x3dfbe76d
    1.0399e+09

    根据这个 on-line converterprintf0x3dfbe76d 相同,所以十六进制值是相反的( 0.123 实际给出的)。

    最佳答案

    这不使用 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 表示浮点, D 表示 double 或 L 表示长 double ),简而言之 -tfD可以用 -e代替或 -F .要仅打印没有地址的值, -A n可以指定。

    关于shell - 如何从shell中的二进制文件打印浮点值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36791622/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com