如何将sql 中十六进制转换十进制
发布网友
发布时间:2022-05-01 02:20
我来回答
共2个回答
热心网友
时间:2022-04-14 23:26
select Convert(int,0xF) --15
select Convert(numeric(18,2),0x030100017D000000) --12.50
--10进制转换为2,8,16进制
Create Function DecTox(@A int,@Type Varchar(3))
Returns Varchar(100)
As
Begin
--从右到左,每一位乘上基数的i-1次方的和
Declare @Rst varchar(100)='' --保存结果
Declare @JS int --转换基数
Declare @YS int --余数
Set @JS=Case @Type
When 'Bin' Then 2
When 'Ocx' Then 8
When 'Hex' Then 16
Else Null End
While @A>0
Begin
Set @YS=@A%@JS
Set @Rst=Case @YS
When 10 Then 'A'
When 11 Then 'B'
When 12 Then 'C'
When 13 Then 'D'
When 14 Then 'E'
When 15 Then 'F'
Else Convert(Varchar(2),@YS)
End+@Rst
Set @A=Convert(int,@A/@JS)
End
return @Rst
End
--2,8,16进制转换为10进制
Create Function fn_xToDec1(@A Varchar(50),@Type Varchar(3))
Returns int
As
Begin
--从右到左,每一位乘上基数的i-1次方的和
Declare @Rst int=0 --保存结果
Declare @JS int --转换基数
Declare @I int --字符串位置
Declare @J int
Set @JS=Case @Type
When 'Bin' Then 2
When 'Ocx' Then 8
When 'Hex' Then 16
Else Null End
Set @I=Len(@A) --从最后一个开始向前截取
Set @J=0
While @I>0
Begin
Set @Rst=@Rst+Case substring(@A,@I,1)
When 'A' Then 10
When 'B' Then 11
When 'C' Then 12
When 'D' Then 13
When 'E' Then 14
When 'F' Then 15
Else substring(@A,@I,1)
End*power(@JS,@J)
Set @J=@J+1
Set @I=@I-1
End
return @Rst
End
热心网友
时间:2022-04-15 00:44
利用SQLSERVER中的varbinary来间接实现。
16进制字符串转10进制bigint(0-FFFFFFFFFFFFFFFF):
由于二进制比较容易转换为bigint 所以先将字符串转为二进制varbinary,再转换为10进制
1
2
3
4
5
6
7
8
CREATE function [dbo].[hextoint](@s varchar(16))
returns bigint
begin
declare @result bigint
set @result=CONVERT(bigint, CONVERT(varbinary, CAST(N'0x' + @s AS char), 1))--最简单有效的方法
return @result
END
GO
10进制转16进制字符串(bigint正负数都可以):相同的思路目前可以将二进制varbinary转换为字符串比较容易,那么先将10进制转二进制再进行16进制字符串输出
1
2
3
4
5
6
7
8
9
CREATE function [dbo].[inttohex](@num bigint)
returns varchar(16)
begin
declare @num2 varbinary(8),@r varchar(50)
set @num2=convert(varbinary(8),@num)--直接转换为二进制
set @r= dbo.varbin2hexstr(@num2)--二进制转16进制字符串
return @r
end
GO
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
CREATE function [dbo].[varbin2hexstr](
@bin varbinary(8000)
)returns varchar(8000)
as
begin
declare @re varchar(8000),@i int
select @re='',@i=datalength(@bin)
while @i>0
select @re=substring('0123456789ABCDEF',substring(@bin,@i,1)/16+1,1)
+substring('0123456789ABCDEF',substring(@bin,@i,1)%16+1,1)
+@re
,@i=@i-1
-- return('0x'+@re)
return @re
end
GO
以上代码测试环境WIN2003+SQLSERVER2008