我有一个javascript对象,我通过websocket作为原始文本传递给客户端。这个原始文本(现在)在收到时直接传递给eval语句。问题是,由于某种原因,Javascript在将数据传递给事件处理程序之前一直在操纵数据。我很有智慧。
通过websocket传递的对象是:
var obj = {
evaluate:function(str) {
digit = parseInt(str,10);
if(isNaN(digit)) {
log.write("Invalid input: "+str);
} else {
log.write(this.spigot(digit));
}
},
spigot:function(digit) {
len = Math.floor(10*digit/3)+1;
A = new Array(len);
for(var i=0;i<len;i++) A[i]=2;
var finalDigit = 0;
var nines = 0;
var predigit = 0;
for(i=1;i<digit+1;i++) {
q = 0;
for(j=len;j>0;j--) {
x = 10*A[j-1] + q*j;
x = Math.floor(x)
A[j-1] = x % ((2*j)-1);
A[j-1] = Math.floor(A[j-1]);
q = x / ((2*j) -1);
q = Math.floor(q);
}
A[0] = Math.floor(q%10);
q = Math.floor(q/10);
if(q==9) {
nines++;
} else if (q==10) {
finalDigit = predigit+1;
for(j=0;j<nines;j++) {
finalDigit = 0;
}
predigit=0;
nines=0;
} else {
finalDigit = predigit;
predigit=q;
for(j=0;j<nines;j++) {
finalDigit = 9;
}
nines=0;
}
}
return finalDigit;
}
}
客户端收到整个邮件(我使用Chrome的开发人员工具和Firebug进行了检查)。但是,当我在以下事件处理程序中收到消息时:
function socketMessage(e) {
log.write(e.data); //a log function I have written
}
e.data包含:
obj = {
evaluate:function(str) {
digit = parseInt(str,10);
if(isNaN(digit)) {
log.write('Invalid input: '+str);
} else {
log.write(this.spigot(digit));
}
},
spigot:function(digit) {
len = Math.floor(10*digit/3)+1;
A = new Array(len);
for(var i=0;i<len;i++) A[i]=2;
var finalDigit = 0;
var nines = 0;
var predigit = 0;
for(i=1;i<digit+1;i++) {
q = 0;
for(j=len;j>0;j--) {
x = 10*A[j-1] + q*j;
x = Math.floor(x)
A[j-1] = x %((MISSING)(2*j)-1);
A[j-1] = Math.floor(A[j-1]);
q = x / ((2*j) -1);
q = Math.floor(q);
}
A[0] = Math.floor(q%)(MISSING);
q = Math.floor(q/10);
if(q==9) {
nines++;
} else if (q==10) {
finalDigit = predigit+1;
for(j=0;j<nines;j++) {
finalDigit = 0;
}
predigit=0;
nines=0;
} else {
finalDigit = predigit;
predigit=q;
for(j=0;j<nines;j++) {
finalDigit = 9;
}
nines=0;
}
}
return finalDigit;
}
}
注意代码是如何变异的。在其中添加了随机(MISSING)
个字符串,并且已经截断了几个方程式。
为什么会这样?
编辑1:
在玩了一会儿之后,我注意到它发生在%
符号之后,无论其位置如何......所以我的问题是,为什么%
运算符在这里有重要意义事件监听器要屠宰我代码的内容吗?
编辑2:
在传递给我的回调函数之前,%
被解释为转义字符。我在尝试使用%25
之前通过套接字发送它,但无济于事。
答案 0 :(得分:0)
Javascript将%
字符解释为转义字符。您看到的(MISSING)
文字是Javascript告诉您转义字符后面没有两位数转义码的方式。解决此问题的最简单方法是定义一个函数mod(a,b)
来完成与模数相同的操作。即:
....},
mod:function(a,b) {
return (a/b-Math.floor(a/b))*b;
}
然后当您需要使用模数运算符时,只需调用
即可Math.floor(this.mod(q,10));