每天一练,编码算法问题,十进制转化为特殊的十六进制

flairsky 2009-01-12 03:04:15
十进制转十六进制,很简单

下面要求个特殊的

规则:
十进制:29327795562177529
转化为正常的十六进制:68 31 79 84 87 63 F9

现在要求转化为这样的:86 13 97 48 78 36 9F

规律这么排版应该看的出了

简单的拆字符串之类的方法是肯定能实现的,我想实现的更高效一点。大家帮帮忙

...全文
321 38 打赏 收藏 转发到动态 举报
写回复
用AI写文章
38 条回复
切换为时间正序
请发表友善的回复…
发表回复
-晴天 2009-01-12
  • 打赏
  • 举报
回复
create function hex(@n int)
returns char(1)
as
begin
declare @c char(1)
if @n<10
set @c=convert(char(1),@n)
else
set @c=char(@n+55)
return @c
end
go
create function longhex(@n bigint)
returns varchar(20)
as
begin
declare @return varchar(20),@t char(1)
set @return=''
while @n>0
begin
set @t=dbo.hex(@n % 16)
set @n=@n/16
set @return=@t+dbo.hex(@n%16)+@return
set @n=@n/16
end
return @return
end
go
select dbo.longhex(29327795562177529)
go
drop function dbo.hex,dbo.longhex
/*
--------------------
8613974878369F
*/
xiaoku 2009-01-12
  • 打赏
  • 举报
回复
学习了...
dawugui 2009-01-12
  • 打赏
  • 举报
回复
--十进制转为十六进制

DECLARE
@binary varbinary(255),
@str_return varchar(255)

SELECT
@binary = CONVERT(varbinary(255),29327795562177529)


EXEC master.dbo.xp_varbintohexstr @binary, @str_return OUTPUT
SELECT
结果 = reverse(@str_return)

/*
结果
__________________________
008613974878369F10000011x0
*/

--十六进制转为十进制
CREATE FUNCTION dbo.f_hex_dec(@s varchar(16))
RETURNS bigint
AS
BEGIN
--作者:pbsql
--参数不得含'0'~'9'、'a'~'f'、'A'~'F'之外的任意字符(首尾空格除外),否则返回0
DECLARE @i int,@result bigint
SELECT @i=0,@result=0,@s=RTRIM(LTRIM(UPPER(REVERSE(@s))))
WHILE @i<LEN(@s)
BEGIN
IF SUBSTRING(@s,@i+1,1) not between '0' and '9' and SUBSTRING(@s,@i+1,1) not between 'A' and 'F'
BEGIN
SELECT @result=0
break
END
SELECT @result=@result+(CHARINDEX(SUBSTRING(@s,@i+1,1),'0123456789ABCDEF')-1)*POWER(16,@i),@i=@i+1
END
RETURN @result
END
GO
flairsky 2009-01-12
  • 打赏
  • 举报
回复
[Quote=引用 32 楼 wgzaaa 的回复:]
还以为散分
[/Quote]

散分太简单了,难的是不动声色的散分 :)
claro 2009-01-12
  • 打赏
  • 举报
回复
[Quote=引用 32 楼 wgzaaa 的回复:]
还以为散分
[/Quote]:)
flairsky 2009-01-12
  • 打赏
  • 举报
回复
有无达人完全不用字符处理方法能解决这个问题?
wgzaaa 2009-01-12
  • 打赏
  • 举报
回复
还以为散分
hapyflystone 2009-01-12
  • 打赏
  • 举报
回复
路过
快乐无边 2009-01-12
  • 打赏
  • 举报
回复
sql语句功能很强大,很想深入学习.
百年树人 2009-01-12
  • 打赏
  • 举报
回复
路过
liberpc 2009-01-12
  • 打赏
  • 举报
回复
学习了
wangzhenyue 2009-01-12
  • 打赏
  • 举报
回复
学习下。。看的眼花了
fcuandy 2009-01-12
  • 打赏
  • 举报
回复
[Quote=引用 16 楼 flairsky 的回复:]
dbo.xp_varbintohexstr 这个我的版本没有,我用的开发版

熊的fn也没找到,是不是要加载什么
[/Quote]

master库下的。
-狙击手- 2009-01-12
  • 打赏
  • 举报
回复
V0.2的有点BUG ,我帮改一下

create function f_int2hex(@num bigint)
returns varchar(100)
as
begin
declare @re varchar(100),@s varchar(100)
set @re=''
set @s = ''
declare @i int
set @i = 0
while @num>0
begin
select @s=substring('0123456789ABCDEF',@num%16+1,1)+@s
,@num=@num/16,@i = @i + 1
if( @I%2 = 0 )
begin
select @re=reverse(right('00'+@s,2))+' '+ @re
set @s = ''
end

end
if len(@s) > 0
select @re=reverse(right('00'+@s,2))+' '+ @re
return(ltrim(@re))
end
go
happvflystone 2009-01-12
  • 打赏
  • 举报
回复
create function f_int2hex(@num bigint)
returns varchar(100)
as
begin
declare @re varchar(100),@s varchar(100)
set @re=''
set @s = ''
declare @i int
set @i = 0
while @num>0
begin
select @s=substring('0123456789ABCDEF',@num%16+1,1)+@s
,@num=@num/16,@i = @i + 1
if( @I%2 = 0 )
begin
select @re=reverse(@s)+' '+ @re
set @s = ''
end
end
return(ltrim(@re))
end
go
select dbo.f_int2hex(29327795562177529)

drop function f_int2hex
/*
----------------------------------------------------------------------------------------------------
86 13 97 48 78 36 9F

(所影响的行数为 1 行)
*/
子陌红尘 2009-01-12
  • 打赏
  • 举报
回复
[Quote=引用 16 楼 flairsky 的回复:]
dbo.xp_varbintohexstr 这个我的版本没有,我用的开发版

熊的fn也没找到,是不是要加载什么
[/Quote]

我的机器装的是SQL Server 2000开发人员版。
flairsky 2009-01-12
  • 打赏
  • 举报
回复
蓉儿的有那么点意思
flairsky 2009-01-12
  • 打赏
  • 举报
回复
熊的方法在最后面还是用了字符串做辅助了,恩

我的想法有些奢侈,我想某位达人是否能看出完整的数学规律,嘿嘿

用移位啊,与或非等数学方法能够解决问题就最好了,毕竟,数字快很多嘛,哈哈
等不到来世 2009-01-12
  • 打赏
  • 举报
回复
Declare @y bigint
Declare @sys int --x进制

Set @y=29327795562177529
Set @sys=16

;With
T1 As(
Select
X=Convert(bigint,@y/@sys),
Y=Convert(nvarchar(1024),Case (@y%@sys)/10 When 0 Then Rtrim(@y%@sys) Else Char(@y%@sys%10+65) End),
L=1
Union All
Select
X=X/@sys,
Y=Convert(nvarchar(1024)
,Case Len(Y)%2
when 0 then Case (X%@sys)/10 When 0 Then Rtrim(X%@sys) Else Char(X%@sys%10+65) End+Y
Else isnull(stuff(Y,2,0,Case (X%@sys)/10 When 0 Then Rtrim(X%@sys) Else Char(X%@sys%10+65) End),Y+Case (X%@sys)/10 When 0 Then Rtrim(X%@sys) Else Char(X%@sys%10+65) End)
End),
L=L+1
From T1 Where X>0
)
Select Top 1 [自定义16进制]=Y From T1 Order By L Desc
/*
自定义16进制
-------------------
8613974878369F
*/
dobear_0922 2009-01-12
  • 打赏
  • 举报
回复
--如果需要在中间加空格的话:

--SQL2005
DECLARE @bi BIGINT, @hexstr VARCHAR(32)
SET @bi=29327795562177529

SELECT @hexstr=UPPER(STUFF(master.sys.fn_varbintohexstr(CAST(@bi AS VARBINARY(64))),1,2,''))

WHILE SUBSTRING(@hexstr,1,2)='00'
SET @hexstr=STUFF(@hexstr,1,2,'')

DECLARE @hexstr2 VARCHAR(32)
SELECT @hexstr2=REVERSE(@hexstr), @hexstr=NULL

WHILE LEN(@hexstr2)>0
SELECT @hexstr=LEFT(@hexstr2,2)+isnull(' '+@hexstr, '')
,@hexstr2=STUFF(@hexstr2,1,2,'')



SELECT @bi, @hexstr
/*
-------------------- --------------------------------
29327795562177529 86 13 97 48 78 36 9F

(1 行受影响)
*/
加载更多回复(18)

22,209

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 疑难问题
社区管理员
  • 疑难问题社区
  • 尘觉
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧