欧美一区二区三区,国内熟女精品熟女A片视频小说,日本av网,小鲜肉男男GAY做受XXX网站

javascript crc32 負數

王浩然1年前7瀏覽0評論
使用JavaScript計算CRC32校驗和時,有時會遇到負數問題,本文將深入探討這個問題,并提供解決方法。 為了便于理解,我們先來看一個例子:計算‘abc’的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);
我們可以得到結果為:`0xE8B7BE43`。 但是,當我們將代碼改為計算‘xyz’的CRC32值時,我們會發現結果變成了負數:`-23286298`。 這是為什么呢? 首先,CRC32的值是一個32-bit的無符號整型,它的取值范圍是0x00000000到0xFFFFFFFF。而JavaScript中,所有的數字類型都是float64,即64位的浮點數,它的符號位占一位,指數位占11位,尾數位占52位。 在計算CRC32值時,我們使用的是無符號整型,即所有的最高位為1的二進制數都是一個合法的CRC32值,在計算過程中也不會對這個值進行符號擴展。但當我們將這個值賦給JavaScript的浮點型變量時,由于符號位被占用,32位無符號整型的最高位變成了符號位,根據二進制補碼表示法,負數的最高位為1. 那么,怎么才能得到正確的CRC32校驗和呢? 在賦值之前,我們需要將32位無符號整數轉換為32位有符號整數。因為在JavaScript中,32位有符號整數和32位無符號整數表示的范圍都是-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); // 將無符號整數轉換為有符號整數
console.log(crc);
這次,我們可以得到正確的結果:`4222100998`。 綜上所述,當我們在JavaScript中計算CRC32校驗和時,需要注意負數問題。可以使用32位有符號整數來避免這個問題,并使用toSigned32函數將無符號整數轉換為有符號整數。