我正在嘗試撰寫一個程式,該程式將通過使用.read()檔案內容上的函式來加密檔案,該函式回傳98\xf1\xc6}xb1\*.... 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()
uj5u.com熱心網友回復:
你可以改變:
f.write(self.new_values)
至:
f.write(''.join(self.new_values).encode('latin-1'))
將listof組合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)
甚至更短,一個簡單的基因expr 饋送到bytes/bytearray建構式:
def convert_file_data(self):
self.new_values = bytes((i 1) % 256 for i in self.content)
任何基于bytesorbytearray的解決方案都優于存盤 a listofstr在:
- 它們需要的記憶體要少得多(可能會快取長度 one
str,但存盤在其中的指向它們的指標list需要 4-8 個位元組,而 raw 只需要一個位元組bytes) - 它的 CPU 密集度較低(附加單個位元組更便宜,并且最后沒有額外的成本來重新
join和encode資料,它本身就已經是正確的形式了)
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/520838.html
