Ich mag es wirklich hexdump
, besonders weil Sie ein benutzerdefiniertes Format definieren können; sagen:
$ echo -e '\x00\x01\x02\x03' | hexdump -v -e '1/1 "%_ad: "' -e '4/1 "%02X "' -e '1/1 " : "' -e '4/1 "%_p"' -e '1/1 "\n"'
0: 00 01 02 03 : ....
4: 0A : .
Ich kann also beispielsweise 4 Bytes pro Zeile wählen, die zuerst hexadezimal und dann als Zeichen geschrieben werden. Was mir hier jedoch fehlt, ist ein Formatierungszeichen für "Binärzeichenfolgen" (oder "Bitfolgen"). zB möchte ich so etwas wie -e '4/1 "%08b "'
irgendwo in diese Kommandozeile schreiben und erhalten, zB:
0: 00 01 02 03 : 00000000 00000001 00000010 00000011 : ....
4: 0A : 00001010 : .
Natürlich müsste man dann wahrscheinlich die Endianness angeben (wenn Gruppen mit mehr als einem Byte formatiert werden sollen) usw. Aber diese Art der Formatierung gibt es auf keinen Fall, soweit ich im hexdump
Handbuch sehen kann .
Meine Frage ist also: Welche Alternativen habe ich in einer Linux-Befehlszeile, damit ich einen formatierten Speicherauszug erhalten kann, der die oben genannten Binärzeichenfolgen enthält und dennoch die Anpassbarkeit des hexdump
Programms (in Bezug auf die Byte-Gruppierung) so weit wie möglich beibehält ) bei Verwendung seiner -e
Option?
quelle
xxd
?:)
. Ich habe ausgechecktxxd
, und es gibt ein-b: Switch to bits (binary digits) dump,
, aber ich kann kein Beispiel finden, in dem diese Ausgabe mit hex gemischt wird (wie ich im OP ein Beispiel angegeben habe); Wenn jemand ein Beispiel dafür mit posten kannxxd
, wäre das eine akzeptable Antwort. Prost!xxd
mit :echo -e '\x00\x01\x02\x03' | xxd -c 2 -b
; Das Vorhandensein des-b
Schalters ändert alles in eine binäre Zeichenfolge und kann daher anscheinend nicht mit hexadezimal "gemischt" werden.Antworten:
In Ermangelung einer Dump - Programm mit geeigneten Dump - Optionen können Sie immer Cobble etwas gemeinsam durch beide mit
hexdump
undxdd
und dann die Ausgabe mit Paste verbinden. Es ist nicht schön, aber es wird eine Shell verwendet, die die Prozessersetzung unterstützt (reicht ausbash
):Ausgabe:
quelle
paste
.Hier ist mein Vorschlag, Perl zu verwenden und seine Formatierungsspezifizierer für die Funktion
pack()
/ zuunpack()
verwenden. Der Testanruf wäre wie folgt:Es ist etwas schwierig, String-Marker dazwischen einzufügen - aber das Schöne ist, dass Sie immer noch Bytes darin "gruppieren" können - z. B. können Sie zwei Bytes gruppieren und sie als vorzeichenbehaftete (kurze) Ganzzahl interpretieren, Beispiel:
Hier ist
hexdump-00.pl
:quelle
Hier sind einige
sed
zu überredendc
,od
die Ausgabe auf Basis 2 zu übersetzen :Es ist jetzt etwas einfacher - was nicht schneller zu erwähnen ist - aber es ist immer noch keine Schönheitskönigin. Es werden auch die Dezimal- und Basis-2-Werte aller Bytes gedruckt.
Wenn ich es starte, bekomme ich:
Oder...
Die Feldbreiten könnten ein wenig Arbeit gebrauchen, aber es liegt ganz bei Ihnen. Sie brauchen die
-N12
Option nicht - ich habe sie nur verwendet, damit ich nicht an einer endlosen Pipe pseudozufälliger Daten erstickt bin. Und das-w4
gibt 4 Bytes pro Zeile an, aber Sie sollten in der Lage sein, eine beliebige Anzahl von Bytes zu verwenden. Der1i2o
sed
Befehl ist auch einedc
Anweisung bezüglich seiner Ausgangsbasis -2
für Binär - aber jede Basis zwischen 2 und 16 sollte genauso gut funktionieren. Wenn Wunsch zu sehen, zum Beispiel, hexadezimal und Basis 2 Ausgang müssen Sie hinzufügen ‚16i‘ zu dieser erstensed
Erklärung und Veränderungod
‚s --t d1z
Optiont x1z
.Weitere Optionen sind ...
printf macht das:
...sogar...
Binär ist nicht ganz so einfach,
bc
kann aber alles, wenn Sie esobase=
Ihren Spezifikationen anpassen:AUSGABE
dc
ist nicht ganz so gesprächig:AUSGABE
Haben
man dc bc
für weitere Informationen.Und für Dateistreams können Sie immer Folgendes verwenden
od
:AUSGABE
Mit ^ ^ dass man sagen , dass ich
od
nicht Offsets drucken - was ich jetzt zweite Mutmaßung - dass ich Ausgänge will-t
ypo
,d
oderx
ein Byte zu einem Zeitpunkt , und dass ich die ASCII - Darstellung willz
jede am Ende angefügt Byte die Zeile-v
erbosely (so druckt es mich nicht nur ein0*
für0000
) bei-w4
Bytes pro Zeile.Ohne
-A n
es druckt:Und jede Kombination von
dc
bc
od
ist natürlich in a möglich|pipeline
.quelle
hexdump
. Prost!od
, dass Offsets nicht mit ausgegeben werden sollen-A n
, um eine Verwechslung der Ausgabe zu vermeiden. Es tut uns leid. Ich werde es wieder zeigen.