xxdには64ビットアドレスがあります。

xxdには64ビットアドレスがあります。

私は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

xxdlongsをアドレスとして使用しますが、明示的に32ビットに切り捨てます。この問題を解決する方法はないようです。それはvimの問題#3791(お届けいただきありがとうございます)、これでパッチ8.1.0854で修正されました。

ただし、入力(使用)には制限がないように見える-rため、標準を使用してod16進ダンプを印刷できます。

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

しかし、odGNUを含むいくつかの実装は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んが、いつでも出力を後処理してアドレスフィールドにオフセットを追加できます。たとえば、次のようになります。hexdumpxxd-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))

または内蔵されzshsysseekいます:

zmodload zsh/system
{
  sysseek -u 1 $((0x5baae0000)) &&
    echo HELLO
} 1<> /dev/sda

xxd0オフセットを使用し、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

おすすめ記事