You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

63 lines
3.7 KiB

(*
* Copyright (c) 2009 - 2013 Monoidics ltd.
* Copyright (c) 2013 - present Facebook, Inc.
* All rights reserved.
*
* This source code is licensed under the BSD style license found in the
* LICENSE file in the root directory of this source tree. An additional grant
* of patent rights can be found in the PATENTS file in the same directory.
*)
let vecH = [|
0x00; 0xC1; 0x81; 0x40; 0x01; 0xC0; 0x80; 0x41; 0x01; 0xC0; 0x80; 0x41; 0x00; 0xC1; 0x81;
0x40; 0x01; 0xC0; 0x80; 0x41; 0x00; 0xC1; 0x81; 0x40; 0x00; 0xC1; 0x81; 0x40; 0x01; 0xC0;
0x80; 0x41; 0x01; 0xC0; 0x80; 0x41; 0x00; 0xC1; 0x81; 0x40; 0x00; 0xC1; 0x81; 0x40; 0x01;
0xC0; 0x80; 0x41; 0x00; 0xC1; 0x81; 0x40; 0x01; 0xC0; 0x80; 0x41; 0x01; 0xC0; 0x80; 0x41;
0x00; 0xC1; 0x81; 0x40; 0x01; 0xC0; 0x80; 0x41; 0x00; 0xC1; 0x81; 0x40; 0x00; 0xC1; 0x81;
0x40; 0x01; 0xC0; 0x80; 0x41; 0x00; 0xC1; 0x81; 0x40; 0x01; 0xC0; 0x80; 0x41; 0x01; 0xC0;
0x80; 0x41; 0x00; 0xC1; 0x81; 0x40; 0x00; 0xC1; 0x81; 0x40; 0x01; 0xC0; 0x80; 0x41; 0x01;
0xC0; 0x80; 0x41; 0x00; 0xC1; 0x81; 0x40; 0x01; 0xC0; 0x80; 0x41; 0x00; 0xC1; 0x81; 0x40;
0x00; 0xC1; 0x81; 0x40; 0x01; 0xC0; 0x80; 0x41; 0x01; 0xC0; 0x80; 0x41; 0x00; 0xC1; 0x81;
0x40; 0x00; 0xC1; 0x81; 0x40; 0x01; 0xC0; 0x80; 0x41; 0x00; 0xC1; 0x81; 0x40; 0x01; 0xC0;
0x80; 0x41; 0x01; 0xC0; 0x80; 0x41; 0x00; 0xC1; 0x81; 0x40; 0x00; 0xC1; 0x81; 0x40; 0x01;
0xC0; 0x80; 0x41; 0x01; 0xC0; 0x80; 0x41; 0x00; 0xC1; 0x81; 0x40; 0x01; 0xC0; 0x80; 0x41;
0x00; 0xC1; 0x81; 0x40; 0x00; 0xC1; 0x81; 0x40; 0x01; 0xC0; 0x80; 0x41; 0x00; 0xC1; 0x81;
0x40; 0x01; 0xC0; 0x80; 0x41; 0x01; 0xC0; 0x80; 0x41; 0x00; 0xC1; 0x81; 0x40; 0x01; 0xC0;
0x80; 0x41; 0x00; 0xC1; 0x81; 0x40; 0x00; 0xC1; 0x81; 0x40; 0x01; 0xC0; 0x80; 0x41; 0x01;
0xC0; 0x80; 0x41; 0x00; 0xC1; 0x81; 0x40; 0x00; 0xC1; 0x81; 0x40; 0x01; 0xC0; 0x80; 0x41;
0x00; 0xC1; 0x81; 0x40; 0x01; 0xC0; 0x80; 0x41; 0x01; 0xC0; 0x80; 0x41; 0x00; 0xC1; 0x81;
0x40 |]
let vecL = [|
0x00; 0xC0; 0xC1; 0x01; 0xC3; 0x03; 0x02; 0xC2; 0xC6; 0x06; 0x07; 0xC7; 0x05; 0xC5; 0xC4;
0x04; 0xCC; 0x0C; 0x0D; 0xCD; 0x0F; 0xCF; 0xCE; 0x0E; 0x0A; 0xCA; 0xCB; 0x0B; 0xC9; 0x09;
0x08; 0xC8; 0xD8; 0x18; 0x19; 0xD9; 0x1B; 0xDB; 0xDA; 0x1A; 0x1E; 0xDE; 0xDF; 0x1F; 0xDD;
0x1D; 0x1C; 0xDC; 0x14; 0xD4; 0xD5; 0x15; 0xD7; 0x17; 0x16; 0xD6; 0xD2; 0x12; 0x13; 0xD3;
0x11; 0xD1; 0xD0; 0x10; 0xF0; 0x30; 0x31; 0xF1; 0x33; 0xF3; 0xF2; 0x32; 0x36; 0xF6; 0xF7;
0x37; 0xF5; 0x35; 0x34; 0xF4; 0x3C; 0xFC; 0xFD; 0x3D; 0xFF; 0x3F; 0x3E; 0xFE; 0xFA; 0x3A;
0x3B; 0xFB; 0x39; 0xF9; 0xF8; 0x38; 0x28; 0xE8; 0xE9; 0x29; 0xEB; 0x2B; 0x2A; 0xEA; 0xEE;
0x2E; 0x2F; 0xEF; 0x2D; 0xED; 0xEC; 0x2C; 0xE4; 0x24; 0x25; 0xE5; 0x27; 0xE7; 0xE6; 0x26;
0x22; 0xE2; 0xE3; 0x23; 0xE1; 0x21; 0x20; 0xE0; 0xA0; 0x60; 0x61; 0xA1; 0x63; 0xA3; 0xA2;
0x62; 0x66; 0xA6; 0xA7; 0x67; 0xA5; 0x65; 0x64; 0xA4; 0x6C; 0xAC; 0xAD; 0x6D; 0xAF; 0x6F;
0x6E; 0xAE; 0xAA; 0x6A; 0x6B; 0xAB; 0x69; 0xA9; 0xA8; 0x68; 0x78; 0xB8; 0xB9; 0x79; 0xBB;
0x7B; 0x7A; 0xBA; 0xBE; 0x7E; 0x7F; 0xBF; 0x7D; 0xBD; 0xBC; 0x7C; 0xB4; 0x74; 0x75; 0xB5;
0x77; 0xB7; 0xB6; 0x76; 0x72; 0xB2; 0xB3; 0x73; 0xB1; 0x71; 0x70; 0xB0; 0x50; 0x90; 0x91;
0x51; 0x93; 0x53; 0x52; 0x92; 0x96; 0x56; 0x57; 0x97; 0x55; 0x95; 0x94; 0x54; 0x9C; 0x5C;
0x5D; 0x9D; 0x5F; 0x9F; 0x9E; 0x5E; 0x5A; 0x9A; 0x9B; 0x5B; 0x99; 0x59; 0x58; 0x98; 0x88;
0x48; 0x49; 0x89; 0x4B; 0x8B; 0x8A; 0x4A; 0x4E; 0x8E; 0x8F; 0x4F; 0x8D; 0x4D; 0x4C; 0x8C;
0x44; 0x84; 0x85; 0x45; 0x87; 0x47; 0x46; 0x86; 0x82; 0x42; 0x43; 0x83; 0x41; 0x81; 0x80;
0x40 |]
let compute_crc16 s cc =
let h = ref 0xFF in
let l = ref 0xFF in
for n = 0 to cc - 1 do
let i = !h lxor Char.code (s.[n]) in
h := !l lxor vecH.(i);
l := vecL.(i)
done;
Printf.sprintf "%02X%02X" !h !l
let crc16 s =
compute_crc16 s (String.length s)