ファイル内の1ビットのみ変更

ファイル内の1ビットのみ変更

ハッシュ関数をテストする必要がありますが、特定のファイルの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回実行すると、ファイルが回復します。

おすすめ記事