3 回答

TA貢獻1936條經驗 獲得超7個贊
假設您的輸入是 ASCII 文本,最簡單的解決方案是將編碼/解碼為 ASCII 并使用內置方法ord()并將chr()字符轉換為字節值,反之亦然。
請注意,該temp值不能小于 0,因此可以刪除第二個 if 語句。
注意:這超出了問題的范圍,但我也注意到您正在自己解析參數。我強烈推薦使用argparse它,因為它非常簡單并且免費為您提供了很多額外的東西(即它執行錯誤檢查,并且如果您使用'--help' 選項啟動應用程序,它會打印一個很好的幫助消息)。請參見下面的示例代碼:
import argparse
parser = argparse.ArgumentParser()
parser.add_argument(dest='filenames', metavar='FILE', type=str, nargs='+',
help='file(s) to encrypt')
args = parser.parse_args()
for filename in args.filenames:
with open(filename, 'rt', encoding='ascii') as file:
lines = file.readlines()
for line in lines:
result = ""
for value in line:
temp = ord(value) # character to int value
temp += 15
if temp > 0x7a:
temp -= 0x7a
result += chr(temp) # int value to character
print(result)

TA貢獻1815條經驗 獲得超13個贊
您可以使用和在整數和十六進制之間來回轉換十六進制。但是,該方法僅適用于整數。因此,首先您需要使用 base=16 轉換為整數。int()hex()hex()
hex_int = int(hex_str, 16)
cipher = hex_int - 15
hex_cipher = hex(cipher)
現在在循環中應用它,您可以根據需要向左或向右移動結果。你當然也可以壓縮代碼。
result = hex(int(hex_string, 16) - 15)
#in a loop
hexes = ['70', '71', 'c280']
ciphered = []
for n in hexes:
ciphered.append(hex(int(n, 16) - 15))

TA貢獻1794條經驗 獲得超8個贊
您可以使用int('somestring'.encode('utf-8').hex(),16)來獲取該網站上的確切值。如果您想對每個角色應用相同的規則,您可以在角色列表中進行。您可以使用
import codecs
def myencode(character,diff):
temp=int(character.encode('utf-8').hex(),16)
temp+=diff
if(temp>0x7a):
temp-=0x7a
elif(temp<=0):
temp+=0x7a
result=codecs.decode(hex(temp)[2:],"hex").decode("utf-8")
return result
diff應該是密碼的移位(可以是整數)。encode('utf-8')將字符串轉換為字節數組并將.hex()字節顯示為十六進制。您應該一次只為這個函數提供一個字符串的一個字符,這樣就不會出現轉移所有內容的問題。
完成編碼后,您需要將其解碼為新字符,您可以通過庫codecs將其從整數轉換為byte( char),然后將其返回為字符串decode("utf-8")
編輯:已更新,現在可以使用了。
添加回答
舉報