将 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
替换为ASCII
或UNICODE
。
- 按照建议将
HEX(...)
替换为 CONVERT(char(4), CONVERT(binary(2), ...), 2)
。here。
我有这个计算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
替换为ASCII
或UNICODE
。 - 按照建议将
HEX(...)
替换为CONVERT(char(4), CONVERT(binary(2), ...), 2)
。here。