首页 > 解决方案 > 将 CRC16 MySQL 函数转换为 SQL Server

问题描述

我有这个计算 crc16 的函数,但它在 MySQL 中,有人可以帮我转换为 SQL Server 吗?

我看了几个地方,但我只找到了 crc32,这不适用于 PIX QRcode 的生成。

下面是我拥有的功能的一个例子。

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//

标签: sqlsql-servercrc16

解决方案


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

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

推荐阅读