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
我的输入是一个 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