Dd

僅更改文件中的一位

  • April 7, 2020

我必須測試一個雜湊函式,並且我只想更改特定文件的一個位。

我嘗試使用 dd 命令。那行得通,但是我只能更改整個字節,而不僅僅是一點。

sudo dd if=/dev/zero of=/file.bin bs=1 seek=10 count=1 conv=notrunc

我還嘗試了帶有正則表達式的 sed 命令,但由於我不知道文件的內容,我不能只將“a”更改為“b”。

有誰知道這樣做的命令?

由於文件可能包含空值,因此面向文本的過濾器sed將失敗。但是您可以使用可以處理空值的程式語言,例如perlor 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),使其可執行,然後使用要修改的文件名和以 bits為單位的偏移量執行它。請注意,它會修改文件。以相同的偏移量執行兩次,您將恢復文件。

引用自:https://unix.stackexchange.com/questions/196251