SQL 字节截断

SQL byte truncate

我的输入是一个 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==”(而不是实际位),因此子字符串不会截断它。

我曾尝试使用位数据类型,但无法存储超过 1 个。

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

它可能很乱,但这是我的答案,根据您在问题中的数据:

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