问题描述
我的输入是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