crc16.js 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276
  1. var isStr = require('./isStr');
  2. var strToBytes = require('./strToBytes');
  3. var TABLE = [
  4. 0x0000,
  5. 0xc0c1,
  6. 0xc181,
  7. 0x0140,
  8. 0xc301,
  9. 0x03c0,
  10. 0x0280,
  11. 0xc241,
  12. 0xc601,
  13. 0x06c0,
  14. 0x0780,
  15. 0xc741,
  16. 0x0500,
  17. 0xc5c1,
  18. 0xc481,
  19. 0x0440,
  20. 0xcc01,
  21. 0x0cc0,
  22. 0x0d80,
  23. 0xcd41,
  24. 0x0f00,
  25. 0xcfc1,
  26. 0xce81,
  27. 0x0e40,
  28. 0x0a00,
  29. 0xcac1,
  30. 0xcb81,
  31. 0x0b40,
  32. 0xc901,
  33. 0x09c0,
  34. 0x0880,
  35. 0xc841,
  36. 0xd801,
  37. 0x18c0,
  38. 0x1980,
  39. 0xd941,
  40. 0x1b00,
  41. 0xdbc1,
  42. 0xda81,
  43. 0x1a40,
  44. 0x1e00,
  45. 0xdec1,
  46. 0xdf81,
  47. 0x1f40,
  48. 0xdd01,
  49. 0x1dc0,
  50. 0x1c80,
  51. 0xdc41,
  52. 0x1400,
  53. 0xd4c1,
  54. 0xd581,
  55. 0x1540,
  56. 0xd701,
  57. 0x17c0,
  58. 0x1680,
  59. 0xd641,
  60. 0xd201,
  61. 0x12c0,
  62. 0x1380,
  63. 0xd341,
  64. 0x1100,
  65. 0xd1c1,
  66. 0xd081,
  67. 0x1040,
  68. 0xf001,
  69. 0x30c0,
  70. 0x3180,
  71. 0xf141,
  72. 0x3300,
  73. 0xf3c1,
  74. 0xf281,
  75. 0x3240,
  76. 0x3600,
  77. 0xf6c1,
  78. 0xf781,
  79. 0x3740,
  80. 0xf501,
  81. 0x35c0,
  82. 0x3480,
  83. 0xf441,
  84. 0x3c00,
  85. 0xfcc1,
  86. 0xfd81,
  87. 0x3d40,
  88. 0xff01,
  89. 0x3fc0,
  90. 0x3e80,
  91. 0xfe41,
  92. 0xfa01,
  93. 0x3ac0,
  94. 0x3b80,
  95. 0xfb41,
  96. 0x3900,
  97. 0xf9c1,
  98. 0xf881,
  99. 0x3840,
  100. 0x2800,
  101. 0xe8c1,
  102. 0xe981,
  103. 0x2940,
  104. 0xeb01,
  105. 0x2bc0,
  106. 0x2a80,
  107. 0xea41,
  108. 0xee01,
  109. 0x2ec0,
  110. 0x2f80,
  111. 0xef41,
  112. 0x2d00,
  113. 0xedc1,
  114. 0xec81,
  115. 0x2c40,
  116. 0xe401,
  117. 0x24c0,
  118. 0x2580,
  119. 0xe541,
  120. 0x2700,
  121. 0xe7c1,
  122. 0xe681,
  123. 0x2640,
  124. 0x2200,
  125. 0xe2c1,
  126. 0xe381,
  127. 0x2340,
  128. 0xe101,
  129. 0x21c0,
  130. 0x2080,
  131. 0xe041,
  132. 0xa001,
  133. 0x60c0,
  134. 0x6180,
  135. 0xa141,
  136. 0x6300,
  137. 0xa3c1,
  138. 0xa281,
  139. 0x6240,
  140. 0x6600,
  141. 0xa6c1,
  142. 0xa781,
  143. 0x6740,
  144. 0xa501,
  145. 0x65c0,
  146. 0x6480,
  147. 0xa441,
  148. 0x6c00,
  149. 0xacc1,
  150. 0xad81,
  151. 0x6d40,
  152. 0xaf01,
  153. 0x6fc0,
  154. 0x6e80,
  155. 0xae41,
  156. 0xaa01,
  157. 0x6ac0,
  158. 0x6b80,
  159. 0xab41,
  160. 0x6900,
  161. 0xa9c1,
  162. 0xa881,
  163. 0x6840,
  164. 0x7800,
  165. 0xb8c1,
  166. 0xb981,
  167. 0x7940,
  168. 0xbb01,
  169. 0x7bc0,
  170. 0x7a80,
  171. 0xba41,
  172. 0xbe01,
  173. 0x7ec0,
  174. 0x7f80,
  175. 0xbf41,
  176. 0x7d00,
  177. 0xbdc1,
  178. 0xbc81,
  179. 0x7c40,
  180. 0xb401,
  181. 0x74c0,
  182. 0x7580,
  183. 0xb541,
  184. 0x7700,
  185. 0xb7c1,
  186. 0xb681,
  187. 0x7640,
  188. 0x7200,
  189. 0xb2c1,
  190. 0xb381,
  191. 0x7340,
  192. 0xb101,
  193. 0x71c0,
  194. 0x7080,
  195. 0xb041,
  196. 0x5000,
  197. 0x90c1,
  198. 0x9181,
  199. 0x5140,
  200. 0x9301,
  201. 0x53c0,
  202. 0x5280,
  203. 0x9241,
  204. 0x9601,
  205. 0x56c0,
  206. 0x5780,
  207. 0x9741,
  208. 0x5500,
  209. 0x95c1,
  210. 0x9481,
  211. 0x5440,
  212. 0x9c01,
  213. 0x5cc0,
  214. 0x5d80,
  215. 0x9d41,
  216. 0x5f00,
  217. 0x9fc1,
  218. 0x9e81,
  219. 0x5e40,
  220. 0x5a00,
  221. 0x9ac1,
  222. 0x9b81,
  223. 0x5b40,
  224. 0x9901,
  225. 0x59c0,
  226. 0x5880,
  227. 0x9841,
  228. 0x8801,
  229. 0x48c0,
  230. 0x4980,
  231. 0x8941,
  232. 0x4b00,
  233. 0x8bc1,
  234. 0x8a81,
  235. 0x4a40,
  236. 0x4e00,
  237. 0x8ec1,
  238. 0x8f81,
  239. 0x4f40,
  240. 0x8d01,
  241. 0x4dc0,
  242. 0x4c80,
  243. 0x8c41,
  244. 0x4400,
  245. 0x84c1,
  246. 0x8581,
  247. 0x4540,
  248. 0x8701,
  249. 0x47c0,
  250. 0x4680,
  251. 0x8641,
  252. 0x8201,
  253. 0x42c0,
  254. 0x4380,
  255. 0x8341,
  256. 0x4100,
  257. 0x81c1,
  258. 0x8081,
  259. 0x4040
  260. ];
  261. if (typeof Int32Array !== 'undefined') TABLE = new Int32Array(TABLE);
  262. exports = function(input, previous) {
  263. return exports.signed(input, previous) >>> 0;
  264. };
  265. exports.signed = function(input, previous) {
  266. if (isStr(input)) input = strToBytes(input);
  267. var crc = ~~previous;
  268. for (var i = 0, len = input.length; i < len; i++) {
  269. var byte = input[i];
  270. crc = (TABLE[(crc ^ byte) & 0xff] ^ (crc >> 8)) & 0xffff;
  271. }
  272. return crc;
  273. };
  274. module.exports = exports;