CRC校驗 迴圈冗餘校驗(Cyclic Redundancy Check, CRC)是一種根據網路數據包或電腦文件等數據產生簡短固定位數校驗碼的一種散列函數,主要用來檢測或校驗數據傳輸或者保存後可能出現的錯誤。它是利用除法及餘數的原理來作錯誤偵測的。在數據傳輸過程中,無論傳輸系統的設計再怎麼完美,差 ...
CRC校驗
迴圈冗餘校驗(Cyclic Redundancy Check, CRC)是一種根據網路數據包或電腦文件等數據產生簡短固定位數校驗碼的一種散列函數,主要用來檢測或校驗數據傳輸或者保存後可能出現的錯誤。它是利用除法及餘數的原理來作錯誤偵測的。在數據傳輸過程中,無論傳輸系統的設計再怎麼完美,差錯總會存在,這種差錯可能會導致在鏈路上傳輸的一個或者多個幀被破壞(出現比特差錯,0變為1,或者1變為0),從而接受方接收到錯誤的數據。為儘量提高接受方收到數據的正確率,在接收方接收數據之前需要對數據進行差錯檢測,當且僅當檢測的結果為正確時接收方纔真正收下數據。檢測的方式有多種,常見的有奇偶校驗、網際網路校驗和迴圈冗餘校驗等。
1 var order = { 2 begin : '3A', 3 number : '00', 4 CommandCode:{ 5 Inventory : '01', 6 StayQuiet : '02', 7 Select : '03', 8 ResetToReady : '04', 9 WriteAFI : '05', 10 LockAFI : '06', 11 ReadBlock : '07' 12 }, 13 dataLen : '0200', 14 orderWay : { 15 anyAsk : '06', 16 anyFsk : '07', 17 oneAsk : '26', 18 oneFsk : '27' 19 }, 20 checkCode : '', 21 end : '0D0A' 22 23 }; 24 var orderString = ''; 25 function makeOrder(a,b) { 26 // 拼接指令(0001020027) 27 orderString = order.number + order.CommandCode[a] + order.dataLen + order.orderWay[b]; 28 //生成校驗碼 29 order.checkCode = CRC.ToModbusCRC16(orderString); 30 //拼接指令 31 orderString = orderString + order.checkCode; 32 //處理指令字元串 33 orderString = orderString.split(''); 34 function topow(x) { 35 return x.charCodeAt().toString(16); 36 }; 37 orderString = orderString.map(topow).join(''); 38 //拼接最終指令 39 orderString = order.begin + orderString + order.end; 40 //編號+ 41 // order.number++; 42 43 }; 44 45 //crc校驗碼生成 46 var CRC = {}; 47 48 CRC.CRC16 = function (data) { 49 var len = data.length; 50 if (len > 0) { 51 var crc = 0xFFFF; 52 53 for (var i = 0; i < len; i++) { 54 crc = (crc ^ (data[i])); 55 for (var j = 0; j < 8; j++) { 56 crc = (crc & 1) != 0 ? ((crc >> 1) ^ 0x8408) : (crc >> 1); 57 } 58 } 59 var hi = ((crc & 0xFF00) >> 8); //高位置 60 var lo = (crc & 0x00FF); //低位置 61 62 return [hi, lo]; 63 } 64 return [0, 0]; 65 }; 66 67 CRC.isArray = function (arr) { 68 return Object.prototype.toString.call(arr) === '[object Array]'; 69 }; 70 71 CRC.ToCRC16 = function (str, isReverse) { 72 return CRC.toString(CRC.CRC16(CRC.isArray(str) ? str : CRC.strToByte(str)), isReverse); 73 }; 74 75 CRC.ToModbusCRC16 = function (str, isReverse) { 76 return CRC.toString(CRC.CRC16(CRC.isArray(str) ? str : CRC.strToHex(str)), isReverse); 77 }; 78 79 CRC.strToByte = function (str) { 80 var tmp = str.split(''), arr = []; 81 for (var i = 0, c = tmp.length; i < c; i++) { 82 var j = encodeURI(tmp[i]); 83 if (j.length == 1) { 84 arr.push(j.charCodeAt()); 85 } else { 86 var b = j.split('%'); 87 for (var m = 1; m < b.length; m++) { 88 arr.push(parseInt('0x' + b[m])); 89 } 90 } 91 } 92 return arr; 93 }; 94 95 CRC.convertChinese = function (str) { 96 var tmp = str.split(''), arr = []; 97 for (var i = 0, c = tmp.length; i < c; i++) { 98 var s = tmp[i].charCodeAt(); 99 if (s <= 0 || s >= 127) { 100 arr.push(s.toString(16)); 101 } 102 else { 103 arr.push(tmp[i]); 104 } 105 } 106 return arr; 107 }; 108 109 CRC.filterChinese = function (str) { 110 var tmp = str.split(''), arr = []; 111 for (var i = 0, c = tmp.length; i < c; i++) { 112 var s = tmp[i].charCodeAt(); 113 if (s > 0 && s < 127) { 114 arr.push(tmp[i]); 115 } 116 } 117 return arr; 118 }; 119 120 CRC.strToHex = function (hex, isFilterChinese) { 121 hex = isFilterChinese ? CRC.filterChinese(hex).join('') : CRC.convertChinese(hex).join(''); 122 123 //清除所有空格 124 hex = hex.replace(/\s/g, ""); 125 //若字元個數為奇數,補一個空格 126 hex += hex.length % 2 != 0 ? " " : ""; 127 128 var c = hex.length / 2, arr = []; 129 for (var i = 0; i < c; i++) { 130 arr.push(parseInt(hex.substr(i * 2, 2), 16)); 131 } 132 return arr; 133 }; 134 135 CRC.padLeft = function (s, w, pc) { 136 if (pc == undefined) { 137 pc = '0'; 138 } 139 for (var i = 0, c = w - s.length; i < c; i++) { 140 s = pc + s; 141 } 142 return s; 143 }; 144 145 CRC.toString = function (arr, isReverse) { 146 if (typeof isReverse == 'undefined') { 147 isReverse = true; 148 } 149 var hi = arr[0], lo = arr[1]; 150 return CRC.padLeft((isReverse ? hi + lo * 0x100 : hi * 0x100 + lo).toString(16).toUpperCase(), 4, '0'); 151 }; 152 // makeOrder('Inventory','oneFsk');