3 回答
TA贡献1936条经验 获得超6个赞
假设您的输入是 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条经验 获得超12个赞
您可以使用和在整数和十六进制之间来回转换十六进制。但是,该方法仅适用于整数。因此,首先您需要使用 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条经验 获得超7个赞
您可以使用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")
编辑:已更新,现在可以使用了。
添加回答
举报