SQL 函数----十六进制转为十进制 (Hec To Dec)
昨天遇到了一个需要用SQL把十六进制数转为十进数,并且写成函数的问题,
上网找了一圈,发现用存储过程或SQL语句写到挺简单(我需要的是函数),
也找到了写成函数的例子,但都不对,改了半天,感觉还不如自己写一个。
今天发布上来,请大家指教一下。
先把整个代码粘上来。
1
CREATE FUNCTION [dbo].[ufn_HecToDec]2
(3
@Hec varchar(50)4
)5
RETURNS int6
AS7
BEGIN8
DECLARE @Dec int,@Count int,@BigBit int,@StrOne int9

10
SET @BigBit = 011
SET @Count = 112
SET @Dec = 013
14
--Get the number of hexadecimal digits 15
WHILE @BigBit < LEN(@Hec)16
BEGIN17
SET @StrOne = ASCII(LOWER(SUBSTRING(@Hec,@Count,1)))18
IF (@StrOne >= 48 AND @StrOne <= 57) 19
OR20
(@StrOne >= 97 AND @StrOne <= 102)21
BEGIN22
SET @BigBit = @BigBit + 123
SET @Count = @Count + 124
CONTINUE25
END26
ELSE27
BREAK28
END 29
30
SET @Count = 131

32
WHILE @BigBit > 033
BEGIN34
SET @StrOne =ASCII(LOWER(SUBSTRING(@Hec,@Count,1)))35
SELECT @Dec = @Dec +36
CAST(37
CASE WHEN @StrOne >=48 AND @StrOne <= 57 THEN @StrOne-4838
WHEN @StrOne = 97 THEN 1039
WHEN @StrOne = 98 THEN 1140
WHEN @StrOne = 99 THEN 1241
WHEN @StrOne = 100 THEN 1342
WHEN @StrOne = 101 THEN 1443
WHEN @StrOne = 102 THEN 1544
END45
AS INT)*POWER(16,@BigBit-1)46
SET @Count = @Count + 147
SET @BigBit = @BigBit - 148
END49

50
RETURN @Dec51
END52
GO
分段说一下
1. 先说一下变量的含义
1
DECLARE @Dec int,@Count int,@BigBit int,@StrOne int2
--@Dec: 存储最终计算出来的十进制数3
--@Count:获取单个字符的开始位置 (用于分析字符串)4
--@BigBit:十六进制数的最高位5
--@StrOne:存储获取的单个字符 (用于分析是否为合法的十六进制 & 十六进制具体值)
2. 获取十六进制数的位数
1
WHILE @BigBit < LEN(@Hec)2
BEGIN3
SET @StrOne = ASCII(LOWER(SUBSTRING(@Hec,@Count,1)))--获取单个字符,并转为ASCII值4
IF (@StrOne >= 48 AND @StrOne <= 57) --判断是否为合法的十六进制数 5
OR -- (48-57: 0-9)6
(@StrOne >= 97 AND @StrOne <= 102) -- (97-102: a-f)7
BEGIN8
SET @BigBit = @BigBit + 1 --如果是合法的十六进数,对十六进制数的位数进行累加9
SET @Count = @Count + 110
CONTINUE11
END12
ELSE13
BREAK --遇到不合法的十六进制数,退出循环14
END
3. 计算十六制数
1
WHILE @BigBit > 0 --以合法的十六进制数的位数做为循环条件2
BEGIN3
SET @StrOne =ASCII(LOWER(SUBSTRING(@Hec,@Count,1)))--获取单个的十六进制数4
SELECT @Dec = @Dec +5
CAST(6
CASE WHEN @StrOne >=48 AND @StrOne <= 57 THEN @StrOne-487
WHEN @StrOne = 97 THEN 10 --a = 108
WHEN @StrOne = 98 THEN 11 --b = 119
WHEN @StrOne = 99 THEN 12 --c = 1210
WHEN @StrOne = 100 THEN 13 --d = 1311
WHEN @StrOne = 101 THEN 14 --e = 1412
WHEN @StrOne = 102 THEN 15 --f = 1513
END14
AS INT)*POWER(16,@BigBit-1) --单个的十六进制数*16的位数立方 (累加)15
SET @Count = @Count + 116
SET @BigBit = @BigBit - 117
END
传入的十六进制数的位数不受限制(但你要考虑数据类型的范围)。
有不对的地方请大家指教。
浙公网安备 33010602011771号