将 CRC16 MySQL 函数转换为 SQL 服务器

Converts CRC16 MySQL function to SQL Server

我有这个计算crc16的函数,但是在MySQL,谁能帮我转换成SQL服务器?

我找了好几个地方,只找到crc32,这对PIX二维码的生成不起作用。

下面是我拥有的函数的示例。

CREATE DEFINER=`root`@`%` FUNCTION `CRC16`( _STRING VARCHAR(25)) RETURNS varchar(50) CHARSET utf8mb4
    DETERMINISTIC
BEGIN
    DECLARE _myCRC integer;
    DECLARE _ord INTEGER;
    DECLARE _n Integer;
    DECLARE _m Integer;
    DECLARE _strlend Integer;
    SET _myCRC := x'FFFF';

      SET _n  := 1;  
      SET _strlend := LENGTH(_STRING) ;
      
        loop_crc:  LOOP
     
            IF  _n > _strlend THEN 
                LEAVE  loop_crc;
            END  IF;
              
            SET _ord := ORD(SUBSTRING(_STRING, _n, 1) );
            SET _myCRC :=  _myCRC ^ _ord;
            SET _m := 0;     
            loop_bit:  LOOP
                IF  _m = 8 THEN 
                    LEAVE  loop_bit;
                END  IF;
                IF (_myCRC & x'0001') = x'0001' THEN
                    SET _myCRC := (_myCRC >> 1) ^ x'A001';
                ELSE
                    SET _myCRC := _myCRC >> 1;        
                END IF;
                SET  _m := _m + 1;
            END LOOP;
            SET  _n := _n + 1;

        END LOOP;

      return HEX(_myCRC); 
 END//

将此函数转换为 Transact-SQL 应该很简单。总的来说:

  • 去掉函数头中的定义符、反引号和 DETERMINISTIC
  • 对于循环,使用WHILE condition BEGIN ... END。注意 'while' 条件是 'leave' 条件的否定。
  • 变量和参数名称必须以 @.
  • 为前缀
  • 使用十进制文字。 (使用计算器转换十六进制。)
  • 使用 = 而不是 := 进行变量赋值。
  • >> 1替换为/ 2
  • LENGTH替换为LEN
  • ORD替换为ASCIIUNICODE
  • 按照建议将 HEX(...) 替换为 CONVERT(char(4), CONVERT(binary(2), ...), 2)here