将c代码转换为js代码后 由于c中定义的变量为 uint 整型8位类型 运行发现由于JS中没有无法自动转换为整型 出现负数时候后会导致计算失败
我该如何改写js代码,还是将负数转换位整数后再计算 底层算法没算明白 求教导
js右偏移分为 有符号右移**(>>)** 和无符号右移**(>>>)** 两种 而c中只有一种
public static unsafe void crc64(ref Crc64 crc, void* data, uint len)
{
uint crc0 = crc.crc0;
uint crc1 = crc.crc1;
byte* cdata = (byte*)data;
while (len-- > 0)
{
int tab_index = ((int)(crc1 >> 24) ^ *cdata++) & 0xFF;
var para1 = crc1 << 8;
var para0 = crc0 >> 24;
crc1 = crc_table1[tab_index] ^ ((crc1 << 8) | (crc0 >> 24));
crc0 = crc_table0[tab_index] ^ (crc0 << 8);
}
crc.crc0 = crc0;
crc.crc1 = crc1;
}
//JS代码
crc64 function(buffer) {
crc64.crc0 = 0xffffffff;
crc64.crc1 = 0xffffffff;
var crc0 = crc64.crc0;
var crc1 = crc64.crc1;
var length = buffer.byteLength;
for (var i = 0; i < length; i++) {
var tab_index = ((crc1 >>> 24) ^ (buffer[i])) & 0xFF;
crc1 = crc_table1[tab_index] ^ ((crc1 << 8) | (crc0 >>> 24));
crc0 = crc_table0[tab_index] ^ (crc0 << 8);
console.log("tab_index:"+ tab_index + " "+"crc1:"+ crc1 + " "+"crc0:"+ crc0 + " " );
}
crc64.crc0 = crc0;
crc64.crc1 = crc1;
crc64.crc0 ^= 0xffffffff;
crc64.crc1 ^= 0xffffffff;
return crc64;
};
c运行结果
tab_index:255 crc1:1694702041 crc0:830097927
tab_index:101 crc1:514174325 crc0:374208445
tab_index:30 crc1:2636408049 crc0:2617598120
tab_index:157 crc1:755378055 crc0:1402886864
js运行结果 有负数
tab_index:255 crc1:1694702041 crc0:830097927
crc64.js:383 tab_index:101 crc1:514174325 crc0:374208445
crc64.js:383 tab_index:30 crc1:-1658559247 crc0:-1677369176
crc64.js:383 tab_index:157 crc1:755378055 crc0:1402886864
crc64.js:383 tab_index:45 crc1:1408777608 crc0:78960684
https://www.jianshu.com/p/2cb75bfa34b0/
直接上代码,踩得坑都在代码里
var u = navigator.userAgent; //获取到的是个字符串,包括很多信息,我只匹配我想要的信息
var isAnd = u.indexOf("Android") > -1 || u.indexOf("Linux") > -1; //判断是安卓手机
var isIOS = !!u.match(/\(i[^;]+;( U;)? CPU.+Mac OS X/); //判断是苹果手机
if (isAnd) {
var oh = document.documentElement.clientHeight || document.body.clientHeight; //获取变化之前的可视区域的高度
window.addEventListener("resize", function() {
//resize事件,这里有个小坑,当绑定多个事件是后面的会覆盖前面的事件
//所以我是用addEventListener,绑定多个事件
var rh = document.documentElement.clientHeight || document.body.clientHeight;//变化之后的高度
if (rh < oh) {
//软键盘弹出
} else {
//软键盘收起
}
})
}
//苹果中不会触发resize,但是可以用focusin/focusout
if (isIOS) {
document.body.addEventListener("focusin", function() {
//软键盘弹出
});
document.body.addEventListener("focusout", function() {
//软键盘收起
})
}
在JS中将偏移后的负数转换为正数的方法是使用位运算符,将负数转换为无符号整数。具体操作是将负数与无符号整数的最大值相加,得到的结果就是正数。代码如下:
function negativeToPositive(num){
return num + Math.pow(2, 32);
}
比如在代码中,如果需要将-1转换为无符号整数,可以调用函数negativeToPositive(-1)
,结果为4294967295,即2^32-1,表示无符号整数中最大的数。
你想负数变正数
crc64=crc64%(65536*65536)