ハッシュ関数をテストする必要がありますが、特定のファイルの1ビットだけを変更したいと思います。
ddコマンドを使ってみました。これはうまくいきますが、わずかではなくバイト全体のみを変更できます。
sudo dd if=/dev/zero of=/file.bin bs=1 seek=10 count=1 conv=notrunc
また、正規表現を使ってsedコマンドを試しましたが、ファイルの内容がわからないため、「a」を「b」に変更することはできません。
これを行うコマンドを知っている人はいますか?
ベストアンサー1
sed
ファイルにヌル値を含めることができるため、テキスト指向フィルタは失敗します。ただし、perl
またはなどのNULL値を処理できるプログラミング言語を使用できますpython
。これがPython 3ソリューションです。読みやすくするために必要なものよりも数行長くなります。
#!/usr/bin/env python3
"""Toggle the bit at the specified offset.
Syntax: <cmdname> filename bit-offset"""
import sys
fname = sys.argv[1]
# Convert bit offset to bytes + leftover bits
bitpos = int(sys.argv[2])
nbytes, nbits = divmod(bitpos, 8)
# Open in read+write, binary mode; read 1 byte
fp = open(fname, "r+b")
fp.seek(nbytes, 0)
c = fp.read(1)
# Toggle bit at byte position `nbits`
toggled = bytes( [ ord(c)^(1<<nbits) ] )
# print(toggled) # diagnostic output
# Back up one byte, write out the modified byte
fp.seek(-1, 1) # or absolute: fp.seek(nbytes, 0)
fp.write(toggled)
fp.close()
ファイル(たとえばbitflip
)に保存して実行可能にし、変更したいファイル名とオフセットで実行します。ビット単位で。ファイルをその場で修正します。同じオフセットで2回実行すると、ファイルが回復します。