这是我正在开发的软件的一个非常具体的问题。我创建并使用文本编码器,但代码中存在一个小错误。
演示:https://dotjersh.github.io/sangwa/
如果我输入70
,则可以返回的值之一是F0
。
但是,当我解码F0
时,结果为7)
。
我用大量的数据和不同的情况测试了代码,它适用于除此之外的所有其他场景。
代码:
var sangwa = {
array: "~!1@2#3$4%5^6&7*8(9)0_-=+ qQwWeErRtTyYuUiIoOpP[{]}\\|aAsSdDfFgGhHjJkKlL;:\"'zZxXcCvVbBnNmM,<.>/?",
key: function(value){
var a = this.array + this.array;
if(typeof value === "string"){
return this.array.indexOf(value);
} else if(typeof value === "number"){
if(value >= 0){
return a[value];
} else {
return a[this.array.length + value];
}
} else {
return this.array + this.array;
}
}
}
sangwa.encode = function(value){
var result = "";
var rand = Math.floor(Math.random() * 6) + 2;
value = "A" + value;
for(var i = 0; i < value.length; i++){
result += sangwa.key(sangwa.key(value[i]) + rand);
}
return result;
}
sangwa.decode = function(value){
var result = "";
var rand = parseInt(sangwa.key(value[0]) - sangwa.key("A"));
for(var i = 1; i < value.length; i++){
result += sangwa.key(sangwa.key(value[i]) - rand);
}
return result;
}
如果您想以这种方式建议更改,则代码在github上: https://github.com/dotjersh/sangwa/blob/master/sangwa.js
答案 0 :(得分:2)
我可以看到一些错误:
array
”包含空白两次。这就是"F0 "
未按预期解码的原因。事实上,encode("70")
和encode("7)")
rand=6
会产生相同的结果,这使得无法反转。if(value >= 0)
区别毫无意义,因为您的value
对于有效输入始终为正var a = this.array + this.array;
,而不是% array.length
value
方法中切换key
的类型parseInt
中的decode
毫无意义(如果不是错误的话),因为参数已经是整数答案 1 :(得分:0)
享受))
var fox = [ 8, 25, 43, 9, 85 ]; // this is key
function encoder( str, encode )
{
var a = 0, out = '';
for (var i=0; i < str.length; i++)
{
out += String.fromCharCode( str.charCodeAt(i) + ( encode ? fox[a] : -fox[a] ) );
a = ( a + 1 ) % fox.length
}
return out
}
str1 = 'Lorem ipsum dolor sit amet, consectetur \
adipiscing elit, sed do eiusmod tempor incididunt \
ut labore et dolore magna aliqua. Ut enim ad minim \
veniam, quis nostrud exercitation ullamco laboris nisi \
ut aliquip ex ea commodo consequat. Duis aute irure dolor \
in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. \
Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt \
mollit anim id est laborum.';
str2 = 'TnÂ(|Êu9xÁwK|¾|9vº|EKlÄvlÉm {ui}y¾{|w¼(~rÉ49n¹(})\
ºqvÄl9nÂx)¾v|m¾l}u}Ku¶jnumKmÄtnuuzw¶(zrÆ}zY)ª|9w¾u9muurÂ(w¾i\
W)Æ})Ãw{Êl9ºz|}¶|wu}
jÂkKu¶jrÈ(|¾()¶t~¾x9umzKlÄumÄ(|wÈm jÉ69o~¾\
{9~Ém9{Êz~KmÄt)¾v9nÅz~nÃl~rÉ()Ëw
yÉi)Ëm
}umnukuÊu9xÁw)º}9~¼qz)Ã}
jux\
zr¶|7uMnÅ|~ {u{}uw|jºkz)¸}m¶|z)ÃwKyÇwnÃ|EK|ÊvKrÃ(| uÅi9~¾(o¾k)¹m{ÊvKvÄt
}uivuq}KnÈ|9j·w v';
console.log( encoder(str1, true ))
console.log( encoder(str2, false ))
&#13;