
私はxxdが端末でバイナリデータを簡単に操作するのにとても素敵で便利だと思います。ただし、プログラムによって出力されるすべてのアドレスは32ビットに制限されるという制限があります。例えば
root:/# xxd -s 0x5baae0000 /dev/sda
baae0000: 2d7c 6176 6976 6172 7c61 7469 7a61 720a -|avivar|atizar.
最初の5つがありません。つまり、直接使うとxxd -r
思ったよりも早く100億バイトの領域を超えることになるという意味だ。つまり、私はこれをしたい。
root:/# echo HELLO | xxd -o 0x5baae0000 | xxd -r - /dev/sdb
しかし、結局、このように問題を解決する必要がありました。
root:/# echo HELLO | xxd -o 0x5baae0000 | xxd -r -seek 0x500000000 - /dev/sdb
パッチを解析するとき、欠落している0x5000000バイトオフセットをターゲットファイルに追加します。
とにかく、xxdに64ビットアドレスを使用させるための未知の/賢い方法があるのか、それともxxdのように実行されますが、これらの制限のない選択肢があるのだろうか。
答え1
xxd
long
sをアドレスとして使用しますが、明示的に32ビットに切り捨てます。この問題を解決する方法はないようです。それはvimの問題#3791(お届けいただきありがとうございます)、これでパッチ8.1.0854で修正されました。。
ただし、入力(使用)には制限がないように見える-r
ため、標準を使用してod
16進ダンプを印刷できます。
od -j 0x5baae0000 -Ax -vtx1 -N16 /dev/sda
すると、次のように出力されます。
5baae0000 2d 7c 61 76 69 76 61 72 7c 61 74 69 7a 61 72 0a
5baae0010
しかし、od
GNUを含むいくつかの実装はod
そうではありません。探す指定されたオフセットに達します-j
が、すべてのデータを読み取ってスキップするので、あなたの場合のような大きなブロックデバイスには実用的ではありません。
またはASCII側に興味がある場合は、BSDhexdump
を使用してください。
$ hexdump -ve '"%_ax:" 16/1 " %02x"' -e '" " 16 "%_p" "\n"' -s 0x5baae0000 -n 16 /dev/sda
5baae0000: 2d 7c 61 76 69 76 61 72 7c 61 74 69 7a 61 72 0a -|avivar|atizar
どちらも食べられるxxd -r
xxd
次のコマンドを使用すると、実際に出力形式(32ビットアドレス制限なし)を再現できますhexdump
。
hexdump -ve '"%08_ax: " 2/1 "%02x"" " 2/1 "%02x"" " 2/1 "%02x"" " 2/1 "%02x"" "
2/1 "%02x"" " 2/1 "%02x"" " 2/1 "%02x"" " 2/1 "%02x"
' -e '" " 16/1 "%_p" "\n"'
アドレスのオフセットと同等の機能もサポートされていませod
んが、いつでも出力を後処理してアドレスフィールドにオフセットを追加できます。たとえば、次のようになります。hexdump
xxd
-o
perl -pe 's/^\w+/sprintf "%08x", 0xabcdef + hex$&/e'
とにかくファイルの特定のオフセットにデータを書き込むには、次のようにxxd
しますdd
。
echo HELLO | dd bs=1 seek="$((0x5baae0000))" of=/dev/sda
またはksh93
>#((...))
運送業者を探してください。
echo HELLO 1<> /dev/sda >#((0x5baae0000))
または内蔵されzsh
てsysseek
います:
zmodload zsh/system
{
sysseek -u 1 $((0x5baae0000)) &&
echo HELLO
} 1<> /dev/sda
xxd
0オフセットを使用し、dd / ksh93 / zshを使用して実行することもできます。救う:
echo HELLO | xxd | { sysseek -u 1 $((0x5baae0000)) && xxd -r; } 1<> /dev/sda
または:
echo HELLO | xxd | { dd bs=1 seek="$((0x5baae0000))" count=0 && xxd -r; } 1<> /dev/sda
¹見ている源泉、GNUは、ファイルの最後まで検索するのを避けるために(代わりに)入力サイズを取得するためにod
使用します。これは、ブロックデバイスのサイズを反映しないLinuxなどのシステムのブロックデバイスでは機能しません。fstat()
lseek(SEEK_END)
st_size