我正在试图编写一个程序,该程序将使用文件内容上的.read()函数加密文件,该函数返回98\xf1\xc6}xb1\*.我试图通过循环遍历每个字符来加密文件,将其十进制数增加1(数字范围从0 -> 255)。然后将每个递增的数字添加到新的列表中。
新的列表如下所示:
['«', 'û', '$', '\x00', 'Ú']...
如何将此新列表转换为可以以二进制模式编写的格式?
class Encrypting():
def __init__(self):
self.file = "files/test_img.jpg"
def open_file(self):
f = open(self.file, "rb")
self.content = f.read()
print(self.content)
f.close()
def convert_file_data(self):
self.new_values = []
for i in self.content:
new_val = i + 1
if i == 255:
new_val = 0
new_val = chr(new_val)
self.new_values.append(new_val)
def rewrite(self):
f = open("files/conv1.jpg", "wb")
f.write(self.new_values)
f.close()
def main():
encrypt = Encrypting()
encrypt.open_file()
encrypt.convert_file_data()
encrypt.rewrite()
if __name__ == "__main__":
main()发布于 2022-10-18 23:25:17
你可以改变:
f.write(self.new_values) 至:
f.write(''.join(self.new_values).encode('latin-1'))将list of str组合成一个str,然后将其编码为latin-1 (这是头256个Unicode序数到相同值的字节的1-1映射)。
但真正的解决办法是改变:
def convert_file_data(self):
self.new_values = []
for i in self.content:
new_val = i + 1
if i == 255:
new_val = 0
new_val = chr(new_val)
self.new_values.append(new_val)至:
def convert_file_data(self):
self.new_values = bytearray() # A mutable sequence of bytes, ints in range(256), so no type conversions needed
for i in self.content:
new_val = i + 1
if i == 255:
new_val = 0
# chr conversion is unnecessary and counter-productive, so we just append the new byte
self.new_values.append(new_val)本部分:
new_val = i + 1
if i == 255:
new_val = 0可简化为:
new_val = (i + 1) % 256还可以将整个功能简化为:
def convert_file_data(self):
self.new_values = bytearray() # A mutable sequence of bytes, ints in range(256), so no type conversions needed
for i in self.content:
self.new_values.append((i + 1) % 256)或者更短,一个简单的genexpr输入到bytes/bytearray构造函数:
def convert_file_data(self):
self.new_values = bytes((i + 1) % 256 for i in self.content)任何基于bytes或bytearray的解决方案都优于存储list of str的以下内容:
strs的长度,但是存储在list中的指向它们的指针需要4-8个字节,而对于CPU密集型的原始str,则只需要一个字节)(附加单个字节更便宜,并且在结束时不需要额外的代价来恢复join和encode数据,这在本地已经是正确的了)https://stackoverflow.com/questions/74118013
复制相似问题