当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《将整数转换为十六进制,将十六进制转换》经验,为你挑选了7个好方法。

所以我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中执行此操作?



1> Bill Karwin..:

将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和CONVERT(Transact-SQL)的"二进制样式"部分找到.我相信SQL Server 2008或更高版本是必需的.


将其转换为VARBINARY将以十六进制值提供数据.无法对其执行字符串操作
使用8个字符的十六进制时,例如使用ARGB转换为BIGINT而不是INT.INT的最大值仅为2,147,483,647或7FFFFFFF.在使用INT时要小心,往返十六进制的往返行程将起作用,但结果与Excel的Hex2Dec不同.

2> justinpitts..:

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

所以,例如:

SELECT 100, master.dbo.fn_varbintohexstr(100)

给你

100 0x00000064


请参阅缺点上的http://dba.stackexchange.com/questions/46910/sys-fn-varbintohexstr-returns-null-if-varbinary-data-is-more-then-2000-as-datale.

3> 小智..:

SQL Server与Excel的基于字符串的DEC2HEX,HEX2DEC函数等效:

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



4> DenNukem..:

将int转换为十六进制:

SELECT FORMAT(512+255,'X')



5> 小智..:

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

select FORMAT(10,'x2')

结果是:

0a



6> Maksym Kozle..:

这是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



7> Neel Edwards..:

传统的4位十六进制非常直接。十六进制字符串到整数(假定值存储在名为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
                ))))

需要注意的重要一点是,当您开始使用引起寄存器共享的位大小时,尤其是在intel机器上,由于Intel的小尾数性质,寄存器中的高,低,左和右将被交换。例如,当使用varbinary(3)时,我们正在谈论的是6个字符的十六进制。在这种情况下,您的位将从右到左配对为以下索引“ 54,32,10”。在英特尔系统中,您会期望“ 76,54,32,10”。由于您仅使用8个中的6个,因此需要记住自己进行交换。“ 76,54”将成为您的左侧,“ 32,10”将成为您的右侧。逗号将您的高低分开。英特尔交换高点和低点,然后交换左和右。因此,要进行转换...例如,您必须自己进行交换,

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

总之,这应该可以回答您的问题。全面地。

推荐阅读
夏晶阳--艺术
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有