JavaScript CRC32の計算 >>>符号なし右シフト演算

JavaScriptのビット演算にご用心
C言語のようにビット演算を記述すると想定外の動作になったり

符号なし右シフト演算を活用
(-1)>>>0 = 4294967295(0xffffffff)
JavaScriptのビット演算は32bit

class CRC32{
    static table : number[] = [];
    constructor(){
        if(CRC32.table.length > 0){ return; }
        for(let i=0; i<256; ++i){
            let r = i;
            for(let j=0; j<8; ++j){
                if( (r & 1) == 1 ) { r = 0xedb88320^(r>>>1); }
                else { r = r >>> 1; }
            }
            CRC32.table[i] = r >>> 0;
        }
    }

    crc32(data : Uint8Array){
        let crc = 0xffffffff;
        let tbl = CRC32.table; 
        for(let o of data){
            crc = (crc >>> 8) ^ tbl[(crc ^ o)&0xff];
        }
        crc = crc^0xffffffff;  
        return crc >>> 0;
    }
}

参考資料
C言語による[最新]アルゴリズム事典 奥村晴彦著(技術評論社)


いいなと思ったら応援しよう!

zerogram
この記事が役に立ったという方は、サポートお願いします。今後の製作の励みになります。