将整数转换为hex和hex整数
所以我有这个查询工作(其中signal_data
是一列)在Sybase中,但它不能在Microsoft SQL Server中工作:
HEXTOINT(SUBSTRING((INTTOHEX(signal_data)),5,2)) as Signal
我也有它在Excel(其中A1
包含值):
=HEX2DEC(LEFT(DEC2HEX(A1),LEN(DEC2HEX(A1))-2))
有谁知道我将如何在SQL Server中做到这一点?
将INT转换为hex:
SELECT CONVERT(VARBINARY(8), 16777215)
将hex转换为INT:
SELECT CONVERT(INT, 0xFFFFFF)
见http://classicasp.aspfaq.com/general/how-do-i-convert-from-hex-to-int-and-back.html
2015年3月16日更新(作者:Oskar Berggren)
上面的例子有一个局限性,它只有当hex值是一个整数字面量时才起作用。 为了完整起见,如果要转换的值是hexstring(例如在varchar列中find),请使用:
-- If the '0x' marker is present: SELECT CONVERT(INT, CONVERT(VARBINARY, '0x1FFFFF', 1)) -- If the '0x' marker is NOT present: SELECT CONVERT(INT, CONVERT(VARBINARY, '1FFFFF', 2))
注意:string必须包含偶数的hex数字。 奇数的数字会产生错误。
有关更多详细信息,请参见CAST和CONVERT(Transact-SQL)的“二进制样式”部分。 我相信SQL Server 2008或更高版本是必需的。
实际上,内置函数名为master.dbo.fn_varbintohexstr。
所以,例如:
SELECT 100, master.dbo.fn_varbintohexstr(100)
给你
100 0x00000064
与Excel的基于string的DEC2HEX,HEX2DEC函数等效的SQL Server:
--Convert INT to hex string: PRINT CONVERT(VARCHAR(8),CONVERT(VARBINARY(4), 16777215),2) --DEC2HEX --Convert hex string to INT: PRINT CONVERT(INT,CONVERT(VARBINARY(4),'00FFFFFF',2)) --HEX2DEC
这里是SQL服务器的function,它将整数值转换为其hex表示forms为varchar。 应该很容易适应其他数据库types
例如:
SELECT dbo.ToHex(4095) --> FFF
SQL:
CREATE FUNCTION ToHex(@value int) RETURNS varchar(50) AS BEGIN DECLARE @seq char(16) DECLARE @result varchar(50) DECLARE @digit char(1) SET @seq = '0123456789ABCDEF' SET @result = SUBSTRING(@seq, (@value%16)+1, 1) WHILE @value > 0 BEGIN SET @digit = SUBSTRING(@seq, ((@value/16)%16)+1, 1) SET @value = @value/16 IF @value <> 0 SET @result = @digit + @result END RETURN @result END GO
将int转换为hex:
SELECT FORMAT(512+255,'X')
传统的4位hex非常直接。 hexstring整数(假设值存储在字段称为FHexString):
CONVERT(BIGINT,CONVERT(varbinary(4), (SELECT master.dbo.fn_cdc_hexstrtobin( LEFT(FMEID_ESN,8) )) ))
整数转换为hexstring(假设值存储在称为FInteger的字段中):
(SELECT master.dbo.fn_varbintohexstr(CONVERT(varbinary,CONVERT(int, FInteger ))))
需要注意的是,当您开始使用可导致寄存器共享的位大小时(特别是在intel计算机上)时,由于Intel的little endian特性,寄存器中的High,Low和Left以及Rights将被交换。 例如,当使用varbinary(3)时,我们正在讨论一个6字符的Hex。 在这种情况下,你的位被配对为从右到左“54,32,10”的以下索引。 在英特尔系统中,你会期望“76,54,32,10”。 由于您只使用8个中的6个,所以您需要记住自己进行交换。 “76,54”将符合您的要求,“32,10”将符合您的要求。 逗号分隔你的高低。 英特尔交换了高点和低点,然后左转和权利。 所以要做一个转换…感叹,你必须自己交换它们,例如下面的代码转换8个字符的hex中的前6个:
(SELECT master.dbo.fn_replvarbintoint( CONVERT(varbinary(3),(SELECT master.dbo.fn_cdc_hexstrtobin( --intel processors, registers are switched, so reverse them ----second half RIGHT(FHex8,2)+ --0,1 (0 indexed) LEFT(RIGHT(FHex8,4),2)+ -- 2,3 (oindex) --first half LEFT(RIGHT(FHex8,6),2) --4,5 ))) ))
这有点复杂,所以我会尽量保留我的转换为8个字符的hex(varbinary(4))。
总之,这应该回答你的问题。 全面。
Declare @Dato xml Set @Dato = Convert(xml, '<dato>FF</dato>') Select Cast( rw.value( 'xs:hexBinary( text()[1])' , 'varbinary(max)' ) as int ) From @Dato.nodes('dato') as T(rw)
Maksym Kozlenko的答案很好,可以稍微修改,以处理任何代码格式的数值编码。 例如:
CREATE FUNCTION [dbo].[IntToAlpha](@Value int) RETURNS varchar(30) AS BEGIN DECLARE @CodeChars varchar(100) SET @CodeChars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' DECLARE @CodeLength int = 26 DECLARE @Result varchar(30) = '' DECLARE @Digit char(1) SET @Result = SUBSTRING(@CodeChars, (@Value % @CodeLength) + 1, 1) WHILE @Value > 0 BEGIN SET @Digit = SUBSTRING(@CodeChars, ((@Value / @CodeLength) % @CodeLength) + 1, 1) SET @Value = @Value / @CodeLength IF @Value <> 0 SET @Result = @Digit + @Result END RETURN @Result END
所以,一个1.5亿的大数字,只有6个字符(1.5亿=“MQGJMU”)
您也可以使用不同序列中的不同字符作为encryption设备。 或者传入代码字符和字符长度,并作为encryption方法使用。
而相反的:
CREATE FUNCTION [dbo].[AlphaToInt](@Value varchar(7)) RETURNS int AS BEGIN DECLARE @CodeChars varchar(100) SET @CodeChars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' DECLARE @CodeLength int = 26 DECLARE @Digit char(1) DECLARE @Result int = 0 DECLARE @DigitValue int DECLARE @Index int = 0 DECLARE @Reverse varchar(7) SET @Reverse = REVERSE(@Value) WHILE @Index < LEN(@Value) BEGIN SET @Digit = SUBSTRING(@Reverse, @Index + 1, 1) SET @DigitValue = (CHARINDEX(@Digit, @CodeChars) - 1) * POWER(@CodeLength, @Index) SET @Result = @Result + @DigitValue SET @Index = @Index + 1 END RETURN @Result
鉴于:
declare @hexStr varchar(16), @intVal int
IntToHexStr:
select @hexStr = convert(varbinary, @intVal, 1)
HexStrToInt:
declare @query varchar(100), @parameters varchar(50) select @query = 'select @result = convert(int,' + @hb + ')', @parameters = '@result int output' exec master.dbo.Sp_executesql @query, @parameters, @intVal output
使用master.dbo.fnbintohexstr(16777215)
转换为一个varchar
表示。
可以使用SQL Server 2012及以上版本提供的函数FORMAT
select FORMAT(10,'x2')
结果在:0a
IIF(Fields!HIGHLIGHT_COLOUR.Value="","#FFFFFF","#" & hex(Fields!HIGHLIGHT_COLOUR.Value) & StrDup(6-LEN(hex(Fields!HIGHLIGHT_COLOUR.Value)),"0"))
正在为我工作作为字体颜色的expression
要将hexstring转换为INT,我已经在过去使用过。 它可以修改任何基地转换为INT实际上(八进制,二进制,无论)
Declare @Str varchar(200) Set @str = 'F000BE1A' Declare @ndx int Set @ndx = Len(@str) Declare @RunningTotal BigInt Set @RunningTotal = 0 While @ndx > 0 Begin Declare @Exponent BigInt Set @Exponent = Len(@Str) - @ndx Set @RunningTotal = @RunningTotal + Power(16 * 1.0, @Exponent) * Case Substring(@str, @ndx, 1) When '0' then 0 When '1' then 1 When '2' then 2 When '3' then 3 When '4' then 4 When '5' then 5 When '6' then 6 When '7' then 7 When '8' then 8 When '9' then 9 When 'A' then 10 When 'B' then 11 When 'C' then 12 When 'D' then 13 When 'E' then 14 When 'F' then 15 End Set @ndx = @ndx - 1 End Print @RunningTotal
下面是两个函数:dbo.HexToInt和dbo.IntToHex,我用它们进行这样的转换:
if OBJECT_ID('dbo.HexToInt') is not null drop function dbo.HexToInt GO create function dbo.HexToInt (@chars varchar(max)) returns int begin declare @char varchar(1), @len int, @i int, @r int, @tmp int, @pow int set @chars = RTRIM(LTRIM(@chars)) set @len = LEN(@chars) set @i = 1 set @r = 0 while @i <= @len begin set @pow = @len - @i set @char = SUBSTRING(@chars, @i, 1) if @char = '0' set @tmp = 0 else if @char = '1' set @tmp = 1 else if @char = '2' set @tmp = 2 else if @char = '3' set @tmp = 3 else if @char = '4' set @tmp = 4 else if @char = '5' set @tmp = 5 else if @char = '6' set @tmp = 6 else if @char = '7' set @tmp = 7 else if @char = '8' set @tmp = 8 else if @char = '9' set @tmp = 9 else if @char = 'A' set @tmp = 10 else if @char = 'B' set @tmp = 11 else if @char = 'C' set @tmp = 12 else if @char = 'D' set @tmp = 13 else if @char = 'E' set @tmp = 14 else if @char = 'F' set @tmp = 15 set @r = @r + @tmp * POWER(16,@pow) set @i = @i + 1 end return @r end
第二个:
if OBJECT_ID('dbo.IntToHex') is not null drop function dbo.IntToHex GO create function dbo.IntToHex (@val int) returns varchar(max) begin declare @r varchar(max), @tmp int, @v1 int, @v2 int, @char varchar(1) set @tmp = @val set @r = '' while 1=1 begin set @v1 = @tmp / 16 set @v2 = @tmp % 16 if @v2 = 0 set @char = '0' else if @v2 = 1 set @char = '1' else if @v2 = 2 set @char = '2' else if @v2 = 3 set @char = '3' else if @v2 = 4 set @char = '4' else if @v2 = 5 set @char = '5' else if @v2 = 6 set @char = '6' else if @v2 = 7 set @char = '7' else if @v2 = 8 set @char = '8' else if @v2 = 9 set @char = '9' else if @v2 = 10 set @char = 'A' else if @v2 = 11 set @char = 'B' else if @v2 = 12 set @char = 'C' else if @v2 = 13 set @char = 'D' else if @v2 = 14 set @char = 'E' else if @v2 = 15 set @char = 'F' set @tmp = @v1 set @r = @char + @r if @tmp = 0 break end return @r end
你没有一个标准的方式(即ANSI)进行这种转换。
你所做的任何事情都是专有的function。
我build议移动这个转换到你的代码,而不是根据数据库。