我的输入是varchar有效负载(实际上是由十六进制字符组成的(。我想把它转换成比特,然后截断结果进行解码。我已经有了一个内置函数(hexstrtovarbin(,它可以正常工作,并将varchars转换为varbinary。
例如,对于输入"0";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