我想将包含“1”和“0”的二进制等效文件重新转换回其JPG格式(或将其转换回二进制格式)
即我有一个文件,其中包含我使用以下函数从jpg图像转换的所有1和0
def convert_binary(inpath, outpath):
byte2str = ["{:08b}".format(i) for i in range(256)]
with open(inpath, "rb") as fin:
with open(outpath, "w") as fout:
data = fin.read(1024)
while data:
for b in map(ord, data):
fout.write(byte2str[b])
data = fin.read(1024)
convert_binary("image.jpg", "binary_file.txt")
感谢Tim Peters
我现在想要将它(1和0)转换回原始图像,任何帮助都会感激不尽。
P.S:我真的很抱歉这些琐碎的问题,我是一个生物技术专业,python编程不是我的强项。我正在为我的论文试验一个应用程序并且卡住了。答案 0 :(得分:1)
与史蒂夫的回答一脉相承:
with open('input', 'rb', 1024) as fin, open('output', 'wb') as fout:
fout.writelines(chr(int(chunk, 2)) for chunk in iter(lambda: fin.read(8), ''))
答案 1 :(得分:0)
您可以使用x = byte2str[b]
撤消int(x,2)
,然后使用ord
撤消chr
。您的.txt
文件包含原始jpg每个字节的8个字符。所以你的代码应该是这样的:
data = fin.read(1024)
while data:
for i in range(0, len(data), 8):
fout.write(chr(int(data[i:i+8], 2)))
data = fin.read(1024)
不幸的是,read
不能保证准确返回您要求的字节数,因此允许返回更少的字节数。所以我们需要使事情复杂化:
data = fin.read(1024)
while data:
if len(data) % 8 != 0:
# partial read
endidx = len(data) - len(data) % 8
leftover = data[endidx:]
data = data[:endidx]
if len(data) == 0:
raise ValueError('invalid file, length is not a multiple of 8')
for i in range(0, len(data), 8):
fout.write(chr(int(data[i:i+8], 2)))
data = leftover + fin.read(1024)
有更好的方法可以将二进制文件表示为文本,例如base64编码。