【问题标题】:How do I convert decimal encoded hex to ascii in SQL Server 2012如何在 SQL Server 2012 中将十进制编码的十六进制转换为 ascii
【发布时间】:2021-08-03 04:24:18
【问题描述】:

我所拥有的是一串整数值,它们成对地表示字母和数字。我想用SQL来做'12371 12595 8224''S031 '的转换

我已经到了……

CAST(CAST(CAST(SUBSTRING(DataString,1,CHARINDEX(CHAR(9),DataString)-1) as bigint) AS VARBINARY(2)) AS VARCHAR(2))  but that gets me '0S'

注意:CHAR(9) 是因为整数是制表符分隔的。

【问题讨论】:

  • '12371 12595 8224'(也不是你的标题所说的decimal,或者你的代码所暗示的bigint)如何转换为'S032'
  • 12371 是 0x3053,十六进制值的整数表示也是如此。所以这是一个十六进制对,编码为整数。 0x30是字符0的十六进制表示。0x53是字符S的十六进制表示。正如我的代码sn-p所示。
  • 这并不能解释'12371 12595 8224' = 'S032' 的作用。也不告诉我们您的原始来源价值是什么。
  • 所以你的字节顺序被颠倒了,因为 12371 是 0S,正如你所指出的。我将您的期望值设为S031 而不是 S032。
  • 哎呀!~!!!我会纠正我最初的问题。谢谢斯图。

标签: sql sql-server sql-server-2012


【解决方案1】:

因此,这是获得所需输出的一种方法。因为您使用的是 2012,所以有一些有用的函数可用于拆分和聚合您无法使用的字符串。

这使用了一个计数/数字表 - 在此处使用 values() 模拟 - 但您将有一个永久的数字表可供使用。

这会将字符串拆分为行,然后简单地提取高/低字节并使用for xml path 聚合回一个字符串。

this fiddle

declare @v varchar(50)='12371 12595 8224', @delimiter varchar(1)=' ';

with v as (
    select Convert(int,Substring(@delimiter+@v+@delimiter, n.n+1, CharIndex(@delimiter, @delimiter+@v+@delimiter, n.n+1)-n.n-1)) as v
    from 
    /* replace this with tally / numbers table */
    (select * from (values (1),(2),(3),(4),(5),(6),(7),(8),(9),(10),(11),(12),(13),(14),(15),(16),(17),(18),(19),(20))n(n))n
    where n.n <= len(@delimiter+@v+@delimiter)-1
        and substring(@delimiter+@v+@delimiter, n.n, 1) = @delimiter
)

select Concat(Char(v & 0x00ff), char(v/256))
from v
for xml path(''), type

【讨论】:

    【解决方案2】:

    我更深入地研究了数据字符串,发现我只需要解码前 6 个整数。所以我变丑了。考虑到我已经走了多远,缺少的部分是 Reverse 函数。

      REVERSE(CAST(CAST(SUBSTRING(DataString,1,5) as bigint) AS VARBINARY(2)))+
      REVERSE(CAST(CAST(SUBSTRING(DataString,7,5) as bigint) AS VARBINARY(2)))+
      REVERSE(CAST(CAST(SUBSTRING(DataString,13,4) as bigint) AS VARBINARY(2)))+
      REVERSE(CAST(CAST(SUBSTRING(DataString,18,4) as bigint) AS VARBINARY(2)))+
      REVERSE(CAST(CAST(SUBSTRING(DataString,23,5) as bigint) AS VARBINARY(2)))+
      REVERSE(CAST(CAST(SUBSTRING(DataString,29,5) as bigint) AS VARBINARY(2))) AS [Output Code]
    

    如果我需要遍历字符串中的所有整数,While 循环就可以正常工作。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-07-07
      • 1970-01-01
      • 2016-09-27
      • 1970-01-01
      • 2014-11-16
      • 1970-01-01
      • 2019-01-01
      • 2012-06-02
      相关资源
      最近更新 更多