将整数转换为十六进制,将十六进制转换

时间:2009-03-31 20:56:22

标签: sql sql-server integer hex

所以我在Sybase中使用此查询(其中signal_data是一列),但它在Microsoft SQL Server中不起作用:

HEXTOINT(SUBSTRING((INTTOHEX(signal_data)),5,2)) as Signal

我也在Excel中使用它(其中A1包含值):

=HEX2DEC(LEFT(DEC2HEX(A1),LEN(DEC2HEX(A1))-2))

有谁知道如何在SQL Server中执行此操作?

14 个答案:

答案 0 :(得分:104)

将INT转换为十六进制:

SELECT CONVERT(VARBINARY(8), 16777215)

将十六进制转换为INT:

SELECT CONVERT(INT, 0xFFFFFF)

更新2015-03-16

上面的例子有一个限制,它只有在HEX值作为整数文字给出时才有效。为了完整性,如果要转换的值是十六进制字符串(例如在varchar列中找到),请使用:

-- 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))

注意:该字符串必须包含偶数个十六进制数字。奇数位数将产生错误。

更多细节可以在CAST and CONVERT (Transact-SQL)的“二进制样式”部分找到。我相信SQL Server 2008或更高版本是必需的。

答案 1 :(得分:43)

实际上,内置函数名为master.dbo.fn_varbintohexstr。

所以,例如:

SELECT 100, master.dbo.fn_varbintohexstr(100)

给你

100 0x00000064

答案 2 :(得分:25)

Excel的基于字符串的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

答案 3 :(得分:12)

将int转换为十六进制:

SELECT FORMAT(512+255,'X')

答案 4 :(得分:7)

可以使用SQL Server 2012及更高版本上提供的FORMAT功能

select FORMAT(10,'x2')

结果:

0a

答案 5 :(得分:5)

这是SQL服务器的函数,它将整数值转换为其十六进制表示形式为varchar。应该很容易适应其他数据库类型

例如:

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

答案 6 :(得分:5)

传统的4位十六进制非常直接。 Hex String to Integer(假设值存储在名为FHexString的字段中):

CONVERT(BIGINT,CONVERT(varbinary(4),
                (SELECT master.dbo.fn_cdc_hexstrtobin(

                    LEFT(FMEID_ESN,8)                       
                ))
                ))

整数到十六进制字符串(假设值存储在名为FInteger的字段中):

(SELECT master.dbo.fn_varbintohexstr(CONVERT(varbinary,CONVERT(int,
                    FInteger
                ))))

需要注意的重要一点是,当您开始使用导致寄存器共享的位大小时,尤其是在英特尔计算机上,由于英特尔的小端性质,寄存器中的高,低和左和权限将被交换。例如,当使用varbinary(3)时,我们讨论的是6个字符的Hex。在这种情况下,您的位从右到左配对为以下索引“54,32,10”。在英特尔系统中,你会期望“76,54,32,10”。由于您只使用了8个中的6个,因此您需要记住自己进行交换。 “76,54”将符合您的左侧,“32,10”将有资格作为您的权利。逗号分隔你的高低。英特尔交换高点和低点,然后是左边和权利。所以要进行转换...叹息,你必须自己交换它们,例如,以下转换8字符十六进制的前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个字符的十六进制(varbinary(4))。

总之,这应该回答你的问题。全面。

答案 7 :(得分:2)

使用master.dbo.fnbintohexstr(16777215)转换为varchar代表。

答案 8 :(得分:2)

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个字符(150,000,000 =&#34; MQGJMU&#34;)

您还可以使用不同序列中的不同字符作为加密设备。或者传递代码字符和字符长度,并用作加密的salting方法。

相反:

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

答案 9 :(得分:1)

<强>假设:

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

答案 10 :(得分:0)

IIF(Fields!HIGHLIGHT_COLOUR.Value="","#FFFFFF","#" & hex(Fields!HIGHLIGHT_COLOUR.Value) & StrDup(6-LEN(hex(Fields!HIGHLIGHT_COLOUR.Value)),"0"))

正在为我作为字体颜色的表达

答案 11 :(得分:0)

要将Hex字符串转换为INT,我过去曾使用过它。它可以被修改为实际上将任何基数转换为INT(八进制,二进制,无论如何)

...
    case
        when tc.c between 0 and 5 then 1
        when tc.c between 6 and 10 then 2
        when tc.c between 11 and 20 then 3
        when tc.c > 20 then 4
        else -9
    end
from ... as a
    outer apply (select ry_convert(int, [MIXED USE FIELD]) as tc) as c

答案 12 :(得分:0)

下面是两个函数: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

答案 13 :(得分:0)

Maksym Kozlenko 有一个不错的解决方案,其他人则接近发挥了全部潜力,但是却完全没意识到您可以定义任何字符序列,并且< strong>使用,长度为基数。这就是为什么我喜欢他的解决方案的这个经过稍微修改的版本,因为它可以用于基础16或基础17等。

例如,如果您想要字母和数字,但又不喜欢我看起来像1,而O喜欢看起来像0,该怎么办?您可以通过这种方式定义任何序列。以下是“基础36”的一种形式,它跳过了I和O来创建“修改后的基础34”。取消注释十六进制行,改为运行为十六进制。

declare @value int = 1234567890

DECLARE @seq varchar(100) = '0123456789ABCDEFGHJKLMNPQRSTUVWXYZ' -- modified base 34
--DECLARE @seq varchar(100) = '0123456789ABCDEF' -- hex
DECLARE @result varchar(50)
DECLARE @digit char(1)
DECLARE @baseSize int = len(@seq)
DECLARE @workingValue int = @value

SET @result = SUBSTRING(@seq, (@workingValue%@baseSize)+1, 1)

WHILE @workingValue > 0
BEGIN
    SET @digit = SUBSTRING(@seq, ((@workingValue/@baseSize)%@baseSize)+1, 1)

    SET @workingValue = @workingValue/@baseSize
    IF @workingValue <> 0 SET @result = @digit + @result
END 

select @value as Value, @baseSize as BaseSize, @result as Result
  

值,BaseSize,结果

     

1234567890、34,T5URAA

我还根据个人喜好将价值移至工作价值,然后从工作价值副本中进行工作。

以下是用于反转转换(对于任何序列)的附加内容,其碱基定义为序列的长度。

declare @value varchar(50) = 'T5URAA'

DECLARE @seq varchar(100) = '0123456789ABCDEFGHJKLMNPQRSTUVWXYZ' -- modified base 34
--DECLARE @seq varchar(100) = '0123456789ABCDEF' -- hex
DECLARE @result int = 0
DECLARE @digit char(1)
DECLARE @baseSize int = len(@seq)
DECLARE @workingValue varchar(50) = @value

DECLARE @PositionMultiplier int = 1
DECLARE @digitPositionInSequence int = 0

WHILE len(@workingValue) > 0
BEGIN
    SET @digit = right(@workingValue,1)
    SET @digitPositionInSequence = CHARINDEX(@digit,@seq)
    SET @result = @result + ( (@digitPositionInSequence -1) * @PositionMultiplier)

    --select @digit, @digitPositionInSequence, @PositionMultiplier, @result

    SET @workingValue = left(@workingValue,len(@workingValue)-1)
    SET @PositionMultiplier = @PositionMultiplier * @baseSize
END 

select @value as Value, @baseSize as BaseSize, @result as Result