我最近开始在MATLAB中编程,并尝试实现一个类似1337扬声器的发生器/弦乐器操作器,只是为了好玩。作为一个挑战,我试图随机改变每个字符的出现次数,以便不是所有的“a”都改为“@”。
似乎我的尝试在某种程度上起作用,因为它非常随意(但有时无效),但我相信有更好的方法来实现这一点。也许为26个字符中的每个字符添加更多替代品并分别从它们中随机选择?
function O = obfuscate(s)
str = 'hello world';
for i=1:length(str)
randomNum = randi(26,1);
switch randomNum
case 1
str = regexprep(str, 'a', '@', 'once');
case 2
str = regexprep(str, 'b', 'l3', 'once');
case 3
str = regexprep(str, 'c', '<', 'once');
case 4
str = regexprep(str, 'd', '|]', 'once');
case 5
str = regexprep(str, 'e', '3', 'once');
case 6
str = regexprep(str, 'f', '|#', 'once');
case 7
str = regexprep(str, 'g', '6', 'once');
case 8
str = regexprep(str, 'h', '|-|', 'once');
case 9
str = regexprep(str, 'i', '!', 'once');
case 10
str = regexprep(str, 'j', '_/', 'once');
case 11
str = regexprep(str, 'k', '|{', 'once');
case 12
str = regexprep(str, 'l', '1', 'once');
case 13
str = regexprep(str, 'm', '|\/|', 'once');
case 14
str = regexprep(str, 'n', '/\/', 'once');
case 15
str = regexprep(str, 'o', '[]', 'once');
case 16
str = regexprep(str, 'p', '|*', 'once');
case 17
str = regexprep(str, 'q', '9', 'once');
case 18
str = regexprep(str, 'r', '|2', 'once');
case 19
str = regexprep(str, 's', '$', 'once');
case 20
str = regexprep(str, 't', '+', 'once');
case 21
str = regexprep(str, 'u', '|_|', 'once');
case 22
str = regexprep(str, 'v', '\/', 'once');
case 23
str = regexprep(str, 'w', '\X/', 'once');
case 24
str = regexprep(str, 'x', '%', 'once');
case 25
str = regexprep(str, 'y', '¥', 'once');
case 26
str = regexprep(str, 'z', '2', 'once');
end
O = str;
%fprintf('%s(%i)', str(i), randomNum);
end
有什么建议吗?
答案 0 :(得分:1)
您正在生成1到26之间的随机数,但仅在循环字符串时生成。在您的示例中,您只会生成11个随机数,因此在循环字符串时可能永远不会出现混淆。
这解释了为什么它会像你描述的那样“有时无效”。
例如,在一种情况下,您的随机数生成器可以连续生成10个2,这只会改变字符'b'。
您的示例中没有任何b,因此不会对任何文本进行模糊处理。
您可能更成功地使用地图容器(在Matlab帮助中搜索containers.map)将每个字符映射到模糊处理(以替换您的开关案例逻辑),而不是将其留给概率。
然后,你可以在例如...之间生成一个统一的随机数。在每个循环迭代中使用1和2来确定字符是否应该被混淆。示例:
function O = obfuscate(s)
str = 'hello world';
keys ={'h','e','l','o','w','r','d'};
values = {'|-|','3','1','[]','\X/','|2','|]'};
obfuscationMap = containers.Map(keys,values);
tempCell = {} %cell to hold the growing string
for i = 1:length(str)
randomNum = randi(2,1);
switch randomNum
case(1) %obfuscate
if(isKey(obfuscationMap, str(i)) %check key is in map to avoid missing chars
tempCell{end+1} = obfuscationMap(str(i));
else
tempCell{end+1} = str(i);
end
case(2) %don't obfuscate
tempCell{end+1} = str(i);
end
end
O = strjoin(tempStr,''); %combine cell in single string without spaces
使用上面的代码,当randomNum为1时,你会得到一个混淆,如果randomNum是2那么你就不会。
因此,您应该比以前看到的更频繁地进行模糊处理。
您可能需要修改一下以获得您想要的内容。