我必须测试一个散列函数,我只想更改特定文件的一个位。
我尝试使用 dd 命令。那行得通,但我只能更改整个字节,而不仅仅是一点。
sudo dd if=/dev/zero of=/file.bin bs=1 seek=10 count=1 conv=notrunc
Run Code Online (Sandbox Code Playgroud)
我还用正则表达式尝试了 sed 命令,但由于我不知道文件的内容,我不能只是将“a”更改为“b”。
有没有人知道这样做的命令?
由于文件可能包含空值,因此面向文本的过滤器sed
将失败。但是您可以使用可以处理空值的编程语言,例如perl
或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()
Run Code Online (Sandbox Code Playgroud)
将其保存在文件中(例如bitflip
),使其可执行,然后使用要修改的文件名和以位为单位的偏移量运行它。请注意,它会就地修改文件。使用相同的偏移量运行两次,您将恢复文件。