【问题标题】:Converts CRC16 MySQL function to SQL Server将 CRC16 MySQL 函数转换为 SQL Server
【发布时间】:2020-12-04 20:35:37
【问题描述】:

我有这个计算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//

【问题讨论】:

    标签: sql sql-server crc16


    【解决方案1】:

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

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

    【讨论】:

    • Ruud,你能告诉我是否还有其他需要做的改变吗?下面是我的代码,但它仍然存在一些不一致之处。
    • 不一致是指在某些情况下 MySQL 函数会生成正确的 CRC,但 SQL Server 函数没有?您是否有输出不一致的输入示例?
    猜你喜欢
    • 2015-11-05
    • 2012-10-23
    • 2015-06-29
    • 1970-01-01
    • 2021-06-14
    • 2011-03-14
    • 1970-01-01
    • 1970-01-01
    • 2019-09-02
    相关资源
    最近更新 更多