色婷婷狠狠18禁久久YY,CHINESE性内射高清国产,国产女人18毛片水真多1,国产AV在线观看

javascript crc32 負(fù)數(shù)

使用JavaScript計(jì)算CRC32校驗(yàn)和時(shí),有時(shí)會(huì)遇到負(fù)數(shù)問(wèn)題,本文將深入探討這個(gè)問(wèn)題,并提供解決方法。 為了便于理解,我們先來(lái)看一個(gè)例子:計(jì)算‘a(chǎn)bc’的CRC32值。 代碼如下:
const string = 'abc';
let crc = 0xFFFFFFFF;
for (let i = 0; i< string.length; i++) {
const c = string.charCodeAt(i);
crc = (crc >>>8) ^ crc32Table[(crc ^ c) & 0xFF];
}
crc ^= 0xFFFFFFFF;
console.log(crc);
我們可以得到結(jié)果為:`0xE8B7BE43`。 但是,當(dāng)我們將代碼改為計(jì)算‘xyz’的CRC32值時(shí),我們會(huì)發(fā)現(xiàn)結(jié)果變成了負(fù)數(shù):`-23286298`。 這是為什么呢? 首先,CRC32的值是一個(gè)32-bit的無(wú)符號(hào)整型,它的取值范圍是0x00000000到0xFFFFFFFF。而JavaScript中,所有的數(shù)字類(lèi)型都是float64,即64位的浮點(diǎn)數(shù),它的符號(hào)位占一位,指數(shù)位占11位,尾數(shù)位占52位。 在計(jì)算CRC32值時(shí),我們使用的是無(wú)符號(hào)整型,即所有的最高位為1的二進(jìn)制數(shù)都是一個(gè)合法的CRC32值,在計(jì)算過(guò)程中也不會(huì)對(duì)這個(gè)值進(jìn)行符號(hào)擴(kuò)展。但當(dāng)我們將這個(gè)值賦給JavaScript的浮點(diǎn)型變量時(shí),由于符號(hào)位被占用,32位無(wú)符號(hào)整型的最高位變成了符號(hào)位,根據(jù)二進(jìn)制補(bǔ)碼表示法,負(fù)數(shù)的最高位為1. 那么,怎么才能得到正確的CRC32校驗(yàn)和呢? 在賦值之前,我們需要將32位無(wú)符號(hào)整數(shù)轉(zhuǎn)換為32位有符號(hào)整數(shù)。因?yàn)樵贘avaScript中,32位有符號(hào)整數(shù)和32位無(wú)符號(hào)整數(shù)表示的范圍都是-2147483648到2147483647。 代碼如下:
function toSigned32(num) {
return num<< 0;
}
const string = 'xyz';
let crc = 0xFFFFFFFF;
for (let i = 0; i< string.length; i++) {
const c = string.charCodeAt(i);
crc = (crc >>>8) ^ crc32Table[(crc ^ c) & 0xFF];
}
crc ^= 0xFFFFFFFF;
crc = toSigned32(crc); // 將無(wú)符號(hào)整數(shù)轉(zhuǎn)換為有符號(hào)整數(shù)
console.log(crc);
這次,我們可以得到正確的結(jié)果:`4222100998`。 綜上所述,當(dāng)我們?cè)贘avaScript中計(jì)算CRC32校驗(yàn)和時(shí),需要注意負(fù)數(shù)問(wèn)題??梢允褂?2位有符號(hào)整數(shù)來(lái)避免這個(gè)問(wèn)題,并使用toSigned32函數(shù)將無(wú)符號(hào)整數(shù)轉(zhuǎn)換為有符號(hào)整數(shù)。