SQL字节截断

问题描述

我的输入是varchar有效负载(实际上是由十六进制字符组成)。我想将其转换为位,然后截断结果以对其进行解码。 我已经有一个内置函数(hexstrtovarbin)可以正常工作,并将varchars转换为varbinaries。

例如,对于输入“ 4d”,我想将其转换为位(01001101),然后截断前6位,然后再将其转换为整数(并最终得到19)。

DECLARE @payload varchar(4),@binarypayload binary(1),@converted smallint;

SET @payload = '4d';
SET @binarypayload = hexstrtovarbin(@payload);
SET @converted = CAST(SUBSTRING(@binarypayload,1,6) AS int)

如果我这样进行操作,@converted的值为77。这是因为@binarypayload值为“ TQ ==”(不是实际位),因此子字符串不会截断它。

我尝试使用位数据类型,但不能存储其中的一种以上。

有人会知道如何获取实际位以截断它们吗?

解决方法

根据您问题中的数据,这可能很麻烦,但这是我的答案:

declare @intvalue int
set @intvalue=  CONVERT(int,CONVERT(varbinary(max),'4d',2) )

declare @vsresult varchar(16)
declare @inti int
select @inti = 16,@vsresult = ''
declare @Input varchar(16)

--translating ex string in binary digits

while @inti>0
  begin
    select @vsresult=convert(char(1),@intvalue % 2)+@vsresult
    select @intvalue = convert(int,(@intvalue / 2)),@inti=@inti-1
  end


set @Input= left(@vsresult,LEN(@vsresult)-2)  -- here your input string without last two digits,00000000010011 


--now return integer value
 DECLARE @Cnt tinyint = 1
    DECLARE @Len tinyint = LEN(@Input)
    DECLARE @Output bigint = CAST(SUBSTRING(@Input,@Len,1) AS bigint)

    WHILE(@Cnt < @Len) BEGIN
        SET @Output = @Output + POWER(CAST(SUBSTRING(@Input,@Len - @Cnt,1) * 2 AS bigint),@Cnt)

        SET @Cnt = @Cnt + 1
    END

select @Output