sql - 将 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//
解决方案
将此函数转换为 Transact-SQL 应该很简单。一般来说:
- 去掉定义器、反引号和
DETERMINISTIC
函数头。 - 对于循环,使用
WHILE condition BEGIN ... END
. 请注意,“while”条件是“leave”条件的否定。 - 变量和参数名称必须以 . 为前缀
@
。 - 使用十进制文字。(使用计算器转换十六进制。)
- 使用
=
而不是:=
变量赋值。 - 替换
>> 1
为/ 2
。 - 替换
LENGTH
为LEN
。 - 替换
ORD
为ASCII
或UNICODE
。 HEX(...)
按照这里CONVERT(char(4), CONVERT(binary(2), ...), 2)
的建议替换为。
推荐阅读
- kubernetes-helm - 有没有办法停止 helm 升级或使用 kubernates v1.13 版本在 helm 中创建不可变的配置映射?
- java - 将 key->values (variableName->system environment value) 的映射从 application.properties 注入到具有默认值的映射对象
- python - 类激活热图。ValueError:您正在尝试将包含 15 层的权重文件加载到具有 16 层的模型中
- python - django locale-url import error cannot import name 'urlresolvers' from 'django.core'
- amazon-web-services - 带有特使前端代理的亚马逊证书
- asp.net-mvc - 使用 NET 核心存储会话 ID
- c# - 如何根据父模型中的值验证属性?
- algorithm - Bliss 算法的时间复杂度
- python-3.x - 为数据框中的每个组添加额外的行 - 熊猫
- javascript - 为 Ajax 查询的输入字段中的 Javascript 更正事件侦听器