我正在建立一个或多或少的简单加密。 现在经过一些模糊和摆弄后,我遇到了一个我似乎无法找到解决方案的问题。
在加密过程中,我将一个字符串作为输入并将其转换为二进制文件,以便对其进行一些数学运算。在“mathing”部分后我得到这样的字符串:
56010479313713691637235922367138913625577411202663921330215486595
现在在这一步之后我将字符串解析成2对 像这样:
56 01 04 79 31 37 13 69 16 37 23 59 22 36 71 38 13 62 55 77 41 12 02 66 39 21 33 02 15 48 65 95
现在仍然是1个字符串对象。我现在的问题是,我似乎无法构建一种方法来实际使用这些对1 1来对它们进行更多的数学计算(之后我也想将结果转换为ascii或其他东西)。可能只是缺乏睡眠,但我似乎无法找到解决方案,任何帮助将不胜感激:)
编辑:我现在使用了timgeb提供的功能来进一步处理我的代码。 现在我停留在另一个相当愚蠢的地方,让我们称之为bug。
下面是从文件tmp.txt读取加密字符串(数字)的代码片段,注释解释其余部分我猜。 我现在的问题是,当我运行脚本时,它会将int连接回一个字符串,但之后将数字对替换为字母根本不起作用。
#***** Read from tmp.txt *****
alphaStr2 = linecache.getline('tmp.txt', 1)
alphaStr2 = int(alphaStr2) / 123456789
alphaStr = str(alphaStr2)
#***** Split into pairs of 2 *****
alphaStr = " ".join(alphaStr[i:i+2] for i in range(0, (len(alphaStr) + 1), 2))
#***** Convert to list *****
numStr = alphaStr.split()
#***** Convert list content to int's *****
numStr = map(int, numStr)
#***** simple math to adjust to alphabet lenght of 51 (Aa-Zz) *****
numMath = lambda x: x / 1.96078431372549
numStr = map(numMath, numStr)
#***** "round" float numbers to integer *****
numStr = [int(i) for i in numStr]
#***** convert back to string *****
numStr = ' '.join(str(x).zfill(2) for x in numStr)
#***** Convert numbers into letters *****
alphaStr = numStr.replace("00 ", "a")
alphaStr = numStr.replace("01 ", "b")
alphaStr = numStr.replace("02 ", "c")
alphaStr = numStr.replace("03 ", "d")
alphaStr = numStr.replace("04 ", "e")
.......
答案 0 :(得分:0)
拆分你的字符串:
>>> s = '56 01 04 79 31'
>>> numbers = s.split()
>>> numbers
['56', '01', '04', '79', '31']
将它们变成整数:
>>> numbers = map(int, numbers)
>>> numbers
[56, 1, 4, 79, 31]
与他们做一些数学
>>> some_math = lambda x: x+1
>>> numbers = map(some_math, numbers)
>>> numbers
[57, 2, 5, 80, 32]
转换回字符串(假设您希望数字< 10用零填充):
>>> ' '.join(str(x).zfill(2) for x in numbers)
'57 02 05 80 32'
或者bytearray-&gt; str如果这就是你所追求的(需要数字<256):
>>> str(bytearray(numbers))
'9\x02\x05P '
答案 1 :(得分:0)
我认为最佳方法是将此字符串拆分为列表:
sequence = "56 01 04 79 31 37 13 69 16 37 23 59 22 36 71 38 13 62 55 77 41 12 02 66 39 21 33 02 15 48 65 95"
sequence = sequence.split()
结果你会得到字符串列表(你可以检查一下):
print type(sequence[10])
<type 'str'>
然后将此字符串列表转换为int元素列表。
for i in sequence:
convert i to int
我相信你现在可以在列表上做一些数学运算了。
答案 2 :(得分:0)
你意识到了吗
alphaStr = " ".join(alphaStr[i:i+2] for i in range(0, (len(alphaStr) + 1), 2))
没有" ".join()
完全符合您的要求吗?实施例
>>> alphaStr = 'hello world'
>>> x = [alphaStr[i:i+2] for i in range(0, (len(alphaStr) + 1), 2)]
>>> x
[he, ll, o , wo, rl, d]
如果你想要整数,我建议用生成器来做,因为你不需要内存中的整个列表
numbers = (int(alphaStr[i:i+2]) for i in range(0, (len(alphaStr) + 1), 2))
numbers = map(numMath, numbers)
numbers = map(int, numbers)
编辑:
您的替换语句的问题是每个替换都会返回一个替换的新字符串,并且您将覆盖最后一个替换。你应该改为
alphaStr = numStr
alphaStr = alphaStr.replace('00 ', 'a') #Use the updated string to continue replacements
alphaStr = alphaStr.replace('01 ', 'b')
这里要小心,因为你的最后一个号码不会被替换,因为你的字符串将是'01 01 00'
(没有最终空格)。所以你应该在最后添加一个空格
alphaStr = numStr + ' '
alphaStr = alphaStr.replace('00 ', 'a') #Use the updated string to continue replacements
alphaStr = alphaStr.replace('01 ', 'b')
但更好的是,如果你的转换正是如此(00 - > a,01 - &gt; b,......),你应该更好地使用:
alphaStr = ''.join(chr(ord('a')+x) for x in numStr)
此处ord('a')
返回'a'
的ascii代码,然后添加x
并返回相应的字符,加入所有内容。例如:
>>> numStr = [0,2,5,9,12]
>>> ''.join(chr(ord('a')+x) for x in numStr)
acfjm
如果你使用这个,当chr(ord('a')+x)
高于&#39; z&#39;因为ascii代码不会继续使用大写字母;)