ken*_*orb 5 floating-point shell command-line binary-data xxd
我的二进制文件包含双浮点(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..|.?
Run Code Online (Sandbox Code Playgroud)
我可以通过以下方式从Python打印出来:
$ python -c $'from struct import unpack\nwith open("file.bin", "rb") as f: print(unpack("<d", f.read(8)))'
(0.123,)
Run Code Online (Sandbox Code Playgroud)
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
Run Code Online (Sandbox Code Playgroud)
对于第二个和第四个字节,增加-s.
从所有8个字节中获取十进制值:
$ echo $((16#$(xxd -ps -s0 -l8 file.bin)))
-5732404399725297857
Run Code Online (Sandbox Code Playgroud)但是我想0.123在Unix系列上打印原始浮点值().理想情况下使用一些单行(以保持简单作为脚本的一部分),因此我可以将其分配到文本变量或在屏幕上打印值.
我试图使用printf(在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
Run Code Online (Sandbox Code Playgroud)
根据这个在线转换器,0x3dfbe76d它是相同的0.123,所以十六进制值是反向的(xxd实际给出的).
Mar*_*ell 10
这不使用Python,是一种广泛使用的外部工具,Perl.
perl -e "print pack('d>',0.123)" > file.bin
perl -e "print unpack('d>',<>)" < file.bin
0.123
Run Code Online (Sandbox Code Playgroud)
或者您可以使用GNU od实用程序,例如:
od -tfD file.bin
0000000 0.123
0000010
Run Code Online (Sandbox Code Playgroud)
where -t参数指定浮点数(f)后跟可选大小说明符(F对于float,D对于double或Lfor long double)的输出格式,简而言之,-tfD可以用-e或替换-F.只能打印没有地址的值,-A n可以指定.
od -f <filename>
Run Code Online (Sandbox Code Playgroud)
这会将您的文件转储为浮点数。
od是一个标准的 Linux 工具,这就是我使用的。手册页写道:
od - 以八进制和其他格式转储文件
| 归档时间: |
|
| 查看次数: |
5242 次 |
| 最近记录: |