我正在寻找一个插件,可以在Sublime text v3.2.2中使用rot18加密/解密文本。
我试过这个教程(只有rot13(,但它对我不起作用:https://www.sublimetext.com/docs/plugin-examples
我尝试了很多插件,唯一一个运行良好的插件是:(不幸的是它是rot47(
import sublime
import sublime_plugin
class Rot47Command(sublime_plugin.TextCommand):
def run(self, edit):
for region in self.view.sel():
if not region.empty():
s = self.view.substr(region)
s = ''.join(chr(33 + ((ord(ch) + 14) % 94)) for ch in s)
self.view.replace(edit, region, s)
有人在rot18上有任何功能插件吗?
您可以调整您的代码。以下是rot_N的工作原理:
这是高达127:的ASCII范围
a = 32
for k in range(0,16):
print(a+k, chr(a+k), " ", a+16+k, chr(a+16+k), " ", a+32+k, chr(a+32+k), " ",
a+48+k, chr(a+48+k), " ", a+64+k, chr(a+64+k), " ", a+80+k, chr(a+80+k))
# 32 48 0 64 @ 80 P 96 ` 112 p
# 33 ! 49 1 65 A 81 Q 97 a 113 q
# 34 " 50 2 66 B 82 R 98 b 114 r
# 35 # 51 3 67 C 83 S 99 c 115 s
# 36 $ 52 4 68 D 84 T 100 d 116 t
# 37 % 53 5 69 E 85 U 101 e 117 u
# 38 & 54 6 70 F 86 V 102 f 118 v
# 39 ' 55 7 71 G 87 W 103 g 119 w
# 40 ( 56 8 72 H 88 X 104 h 120 x
# 41 ) 57 9 73 I 89 Y 105 i 121 y
# 42 * 58 : 74 J 90 Z 106 j 122 z
# 43 + 59 ; 75 K 91 [ 107 k 123 {
# 44 , 60 < 76 L 92 108 l 124 |
# 45 - 61 = 77 M 93 ] 109 m 125 }
# 46 . 62 > 78 N 94 ^ 110 n 126 ~
# 47 / 63 ? 79 O 95 _ 111 o 127
ROT n意味着你取chr(ord(l)+n)
的字母。包裹时要小心。
对于rot_N的计算,基本公式为:
def rot_N(n,letter):
return chr( (ord(letter)-32+n) % (128-32) + 32) # 128-32 = 96
您可以使用进行测试
k="Hello Zzzzz"
print( ''.join(rot_N(18, l) for l in k)) # schould give you a tranlation
print( ''.join(rot_N(0, l) for l in k)) # should give the exact text
并使用测试反向
k_inverse ="Zw~~!2l,,,,"
print( ''.join(rot_N(-18, l) for l in k_inverse)) # use -18 here
print( ''.join(rot_N(0, l) for l in k_inverse))
如果更换
s = ''.join(chr(33 + ((ord(ch) + 14) % 94)) for ch in s)
带
s = ''.join(rot_N(18, ch) for ch in s))
你应该没事的。
您没有指定,但我假设您在36个字符的字符集0..9,A..Z上使用ROT-18。36/2=18,因此ROT-18。
ROT-13适用于26个字母字符:26/2=13。你想让它适应ROT-18。
主要的区别在于,ASCII字符集中的字母字符是连续的,并且这种假设内置于要复制的代码中。ROT-47也是如此;所使用的ASCII字符是连续的。对于ROT-18,数字0..9和字母字符A..Z在ASCII中不是连续的。从:
(#58(到@
(#64(,它们之间存在间隙。该区域中的ASCII代码既不是数字也不是字母。
一种解决方案是设置自己的数组,而不是按照ASCII顺序,其中两者是连续的:[0, 1, ... 9, A, B, ... Z]
。编写程序来处理该数组。
或者,您可以使用ASCII代码,专门处理从#58到#64的代码,以使转换正确。
第一个选项可能更容易,代码将更类似于ROT-13示例。主要的区别是将返回ASCII代码的ord()
函数替换为给出数组中位置的等效函数。