I Binärdatei bestehend Doppelschwimmer (8 Byte) oder einfach nur schwimmen (4 Byte) Wert habe, die in der folgenden Art und Weise erzeugt wurden:Wie float Wert aus Binärdatei in der Shell zu drucken?
$ 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..|.?
, das ich es wieder aus Python über drucken konnte:
$ python -c $'from struct import unpack\nwith open("file.bin", "rb") as f: print(unpack("<d", f.read(8)))'
(0.123,)
Das gleiche für 4-Byte-Float, ändern Sie einfach <d
in <f
(später als float.bin
erwähnt).
Wie drucke ich diesen Wert aus dem Shell-Skript mit sauberer Weise (ohne Python)? Entweder unter Verwendung von eingebauten Werkzeugen (z. B. printf
) oder weit verbreiteten externen Werkzeugen (z. B. xxd
, dc
, bc
, od
, hexdump
usw.).
Zum Beispiel Dezimalwerte zu drucken, kann ich xxd
(Teil von VIM) verwenden, z.B. in Bash:
den Wert des ersten Bytes erhalten:
$ echo $((16#$(xxd -ps -s0 -l1 file.bin))) 176
Für 2. und her Bytes, erhöhen
-s
.erhalten Dezimalwert aus allen 8 Bytes:
$ echo $((16#$(xxd -ps -s0 -l8 file.bin))) -5732404399725297857
Allerdings Ich mag würde Original Floating-Wert (0.123
) auf Unix-Familie System drucken. Idealerweise mit einem Einzeiler (um es als Teil des Skripts einfach zu halten), also kann ich es als Textvariable zuweisen oder den Wert auf dem Bildschirm ausgeben.
Ich habe versucht, printf
zu verwenden (auf der 4-Byte-Float-Zahl, um es einfacher zu machen), aber es hat nicht wie erwartet:
$ 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
wo nach dieser on-line converter, 0x3dfbe76d
ist das gleiche wie 0.123
, also sind die Hex-Werte umgekehrt (was xxd
tatsächlich gibt).
+1: Klingt wie 'od' (Teil von' coreutils') ist noch kürzer, das funktioniert super, danke. Hier ist die getrimmte Version: 'od -tfD file.bin | awk '{print $ 2}' | Xargs'. – kenorb