小男孩‘自慰网亚洲一区二区,亚洲一级在线播放毛片,亚洲中文字幕av每天更新,黄aⅴ永久免费无码,91成人午夜在线精品,色网站免费在线观看,亚洲欧洲wwwww在线观看

分享

CRC算法

 wfsy1983 2011-01-01
CRC32算法(C++轉JavaScript) 收藏
這段時間我在研究一下HTML文件傳輸的問題,但我研究的東西在發(fā)送文件過程中沒有加入校驗碼,很多人都知道,網絡傳輸會存在數據丟失,錯誤等問題,所以要自行加入校驗碼。
在網上看了一些校驗算法,發(fā)覺CRC16和CRC32相對比較簡單(因為我的文件接收端是嵌入式系統,所以不能太復雜,以免浪費資源),因此在網上找了一個C++的CRC32的算法,具體如下:
view plaincopy to clipboardprint?
unsigned int GetCrc32(char* InStr,unsigned int len){     
    //生成Crc32的查詢表  
    unsigned int Crc32Table[256];   
    int i,j;     
    unsigned int Crc;     
    for (i = 0; i < 256; i++)  
    {     
        Crc = i;     
        for (j = 0; j < 8; j++)  
        {     
            if (Crc & 1)     
                Crc = (Crc >> 1) ^ 0xEDB88320;          
            else    
                Crc >>= 1;   
        }     
        Crc32Table[i] = Crc;     
    }     
    //開始計算CRC32校驗值  
    Crc=0xffffffff;     
    for(int i=0; i<len; i++){    
        Crc = (Crc >> 8)^ Crc32Table[(Crc & 0xFF) ^ InStr[i]];     
    }  
      
    Crc ^= 0xFFFFFFFF;  
    return Crc;     
}    
unsigned int GetCrc32(char* InStr,unsigned int len){  
 //生成Crc32的查詢表
 unsigned int Crc32Table[256];
 int i,j;  
 unsigned int Crc;  
 for (i = 0; i < 256; i++)
 {  
  Crc = i;  
  for (j = 0; j < 8; j++)
  {  
   if (Crc & 1)  
    Crc = (Crc >> 1) ^ 0xEDB88320;     
   else 
    Crc >>= 1;
  }  
  Crc32Table[i] = Crc;  
 }  
 //開始計算CRC32校驗值
 Crc=0xffffffff;  
 for(int i=0; i<len; i++){ 
  Crc = (Crc >> 8)^ Crc32Table[(Crc & 0xFF) ^ InStr[i]];  
 }
 
 Crc ^= 0xFFFFFFFF;
 return Crc;  
}    上面的代碼來網絡,本人經過測試,在VC++中可以正常使用,而且結果也是正常的。
因為我是用與HTML,所以我想利用JS算出校驗碼后,再發(fā)送。但由于我不太了解JS所以,只有在網上找找例子。因此,我在網上找了一段JS代碼
view plaincopy to clipboardprint?
function makeCrc32Table() {  
    if (typeof(window.crc32Table) != "undefined") return;  
    window.crc32Table = new Array(256);  
    for (var i = 0; i < 256; i++) {  
        var k = i;  
        for (var j = 0; j < 8; j++)  
            if (k & 1)  
                k = (k >> 1) ^ 0xedb88320;  
            else k >>= 1;  
        crc32Table[i] = k;  
    }  
}  
function crc32(str) {  
    makeCrc32Table();  
    if (typeof str != "string") str = "" + str;  
    var crc = 0xffffffff;  
    for (var i = 0; i < str.length; i++) {  
        var code = str.charCodeAt(i);  
        if (code > 0xff) {  
            crc = (crc >> 8) ^ crc32Table[(crc & 0xff) ^ (code & 0xff)];  
            crc = (crc >> 8) ^ crc32Table[(crc & 0xff) ^ (code >> 8)];  
        } else crc = (crc >> 8) ^ crc32Table[(crc & 0xff) ^ code];  
    }  
    return crc ^ 0xffffffff;  

function makeCrc32Table() {
    if (typeof(window.crc32Table) != "undefined") return;
    window.crc32Table = new Array(256);
    for (var i = 0; i < 256; i++) {
        var k = i;
        for (var j = 0; j < 8; j++)
            if (k & 1)
                k = (k >> 1) ^ 0xedb88320;
            else k >>= 1;
        crc32Table[i] = k;
    }
}
function crc32(str) {
    makeCrc32Table();
    if (typeof str != "string") str = "" + str;
    var crc = 0xffffffff;
    for (var i = 0; i < str.length; i++) {
        var code = str.charCodeAt(i);
        if (code > 0xff) {
            crc = (crc >> 8) ^ crc32Table[(crc & 0xff) ^ (code & 0xff)];
            crc = (crc >> 8) ^ crc32Table[(crc & 0xff) ^ (code >> 8)];
        } else crc = (crc >> 8) ^ crc32Table[(crc & 0xff) ^ code];
    }
    return crc ^ 0xffffffff;
}

這段代碼也是來自網絡的,我也研究過,算法上是一模一樣,而且一些操作符名稱上是一樣的,>>這是移位,^這是位異或,&這是位與。
經過驗證,發(fā)現了一些JS與C++運算符的上差別:
1、>>這個是右位移,但是 它移動后并不像C++中的>>在前面補零,而是在前補1(可能是最高位為1就補1,為零就補零),所以運算出來的結果完全不相同。
2、在JS中,字符與上一個16進制數,結果是一個0,即‘a’&0xff 等于0,JS不同C++,C++中字符與上一個16進制數,它會自動轉成16進行數再進行運算,但在JS中與上的值就明顯不正確。
下面是我經過修改的結果,而且通過了我的驗證
view plaincopy to clipboardprint?
function GetCrc32(Instr)  
{  
    if(typeof(window.Crc32Table)!="undefined")return;  
    window.Crc32Table=new Array(256);  
    var i,j;  
    var Crc;  
    for(i=0; i<256; i++)  
    {  
        Crc=i;  
        for(j=0; j<8; j++)  
        {  
            if(Crc & 1)  
                Crc=((Crc >> 1)& 0x7FFFFFFF) ^ 0xEDB88320;  
            else 
                Crc=((Crc >> 1)& 0x7FFFFFFF);  
        }  
        Crc32Table[i]=Crc;  
    }  
    if (typeof Instr != "string") Instr = "" + Instr;  
    Crc=0xFFFFFFFF;  
    for(i=0; i<Instr.length; i++)  
        Crc=((Crc >> 8)&0x00FFFFFF) ^ Crc32Table[(Crc & 0xFF)^ Instr.charCodeAt(i)];  
    Crc ^=0xFFFFFFFF;  
    return Crc;  

function GetCrc32(Instr)
{
 if(typeof(window.Crc32Table)!="undefined")return;
 window.Crc32Table=new Array(256);
 var i,j;
 var Crc;
 for(i=0; i<256; i++)
 {
  Crc=i;
  for(j=0; j<8; j++)
  {
   if(Crc & 1)
    Crc=((Crc >> 1)& 0x7FFFFFFF) ^ 0xEDB88320;
   else
    Crc=((Crc >> 1)& 0x7FFFFFFF);
  }
  Crc32Table[i]=Crc;
 }
 if (typeof Instr != "string") Instr = "" + Instr;
 Crc=0xFFFFFFFF;
 for(i=0; i<Instr.length; i++)
  Crc=((Crc >> 8)&0x00FFFFFF) ^ Crc32Table[(Crc & 0xFF)^ Instr.charCodeAt(i)];
 Crc ^=0xFFFFFFFF;
 return Crc;
} 修改成上面的函數后,輸出結果是一個10進制數,可能經過轉換后,以16進制顯示,這里我就不再說明了。
 
本文來自CSDN博客,轉載請標明出處:http://blog.csdn.net/bakasen/archive/2010/11/29/6043797.aspx

    本站是提供個人知識管理的網絡存儲空間,所有內容均由用戶發(fā)布,不代表本站觀點。請注意甄別內容中的聯系方式、誘導購買等信息,謹防詐騙。如發(fā)現有害或侵權內容,請點擊一鍵舉報。
    轉藏 分享 獻花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約