【问题标题】:How to convert Hex to String in Sql server如何在 Sql server 中将十六进制转换为字符串
【发布时间】:2017-08-17 07:50:12
【问题描述】:

这是我的十六进制输入

0x3c0x3c0x5bIMG0x5d0x5bSIZE0x5dHALF0x5b0x2fSIZE0x5d0x5bID0x5d540x5b0x2fID0x5d0x5b0x2fIMG0x5d0x3e0x3e

预期输出是:

<<[IMG][SIZE]HALF[/SIZE][ID]54[/ID][/IMG]>>

【问题讨论】:

  • 选择转换(VARCHAR(MAX),0x3c0x3c0x5bIMG0x5d0x5bSIZE0x5dHALF0x5b0x2fSIZE0x5d0x5bID0x5d540x5b0x2fID0x5d0x5b0x2fIMG0x5d0x3e0x3e);
  • 这个链接对我没有帮助。需要得到准确的 > 这个结果。

标签: sql sql-server sql-server-2012 sql-server-2008-r2 hex


【解决方案1】:

如果它只是用于始终需要在变量中替换的一小部分 ascii 代码,那么您也可以像这样替换它们:

declare @string varchar(max) = '0x3c0x3c0x5bIMG0x5d0x5bSIZE0x5dHALF0x5b0x2fSIZE0x5d0x5bID0x5d540x5b0x2fID0x5d0x5b0x2fIMG0x5d0x3e0x3e';

select @string = replace(@string,hex,chr)
from (values 
('0x3c','<'),
('0x3e','>'),
('0x5b','['),
('0x5d',']'),
('0x2f','/')
) hexes(hex,chr);

select @string as string;

返回:

string
------
<<[IMG][SIZE]HALF[/SIZE][ID]54[/ID][/IMG]>>

如果有更多字符,或者硬编码不受欢迎?
然后循环替换也会得到这个结果:

declare @string varchar(max) = '0x3c0x3c0x5bIMG0x5d0x5bSIZE0x5dHALF0x5b0x2fSIZE0x5d0x5bID0x5d540x5b0x2fID0x5d0x5b0x2fIMG0x5d0x3e0x3e';

declare @loopcount int = 0;
declare @hex char(4);
while (patindex('%0x[0-9][a-f0-9]%',@string)>0 
       and @loopcount < 128) -- just safety measure to avoid infinit loop
begin
    set @hex = substring(@string,patindex('%0x[0-9][a-f0-9]%',@string),4);
    set @string = replace(@string, @hex, convert(char(1),convert(binary(2), @hex, 1)));
    set @loopcount = @loopcount + 1;
end;

select @string as string;

如果您将它包装在 UDF 中,那么您甚至可以在查询中使用它。

【讨论】:

  • 这就是我要找的东西,非常感谢您的帮助!!
  • @NileshBankar 谢谢。如果有更多代码要替换,我已经包含了一个非硬编码版本。
【解决方案2】:

您的字符串混合了十六进制和字符数据,因此您需要使用代码对其进行解析。一个棘手的部分是将0xCC 子字符串转换为它所代表的字符。首先假设它是二进制的,然后转换为 char。使用递归遍历所有0xCC 子字符串

declare @imp nvarchar(max) = '0x3c0x3c0x5bIMG0x5d0x5bSIZE0x5dHALF0x5b0x2fSIZE0x5d0x5bID0x5d540x5b0x2fID0x5d0x5b0x2fIMG0x5d0x3e0x3e';

with cte as (
select replace(col, val, cast(convert(binary(2), val, 1) as char(1))) as col
 from (
   -- sample table
   select @imp as col
   ) tbl
 cross apply (select patindex('%0x__%',tbl.col) pos) p
 cross apply (select substring(col,pos,4) val) v
union all
select replace(col, val, cast(convert(binary(2), val, 1) as char(1))) as col
 from cte 
 cross apply (select patindex('%0x__%',col) pos) p
 cross apply (select substring(col,pos,4) val) v
where pos > 0
)
select * 
from cte
where patindex('%0x__%',col) = 0;

返回

col
<<[IMG][SIZE]HALF[/SIZE][ID]54[/ID][/IMG]>>

【讨论】:

  • 感谢您的帮助!!
猜你喜欢
  • 1970-01-01
  • 2013-02-07
  • 2010-09-18
  • 1970-01-01
  • 2017-08-23
  • 2014-03-19
  • 2011-08-25
  • 2014-04-28
相关资源
最近更新 更多