Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/85.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 将整数转换为十六进制,将十六进制转换为整数_Sql_Sql Server_Integer_Hex - Fatal编程技术网

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

Sql 将整数转换为十六进制,将十六进制转换为整数,sql,sql-server,integer,hex,Sql,Sql Server,Integer,Hex,因此,我在Sybase中使用了此查询(其中,signal\u data是一列),但在Microsoft SQL Server中不起作用: HEXTOINT(SUBSTRING((INTTOHEX(signal_data)),5,2)) as Signal 我在Excel中也有它(其中A1包含值): 有人知道我将如何在SQL Server中执行此操作吗?将INT转换为十六进制: SELECT CONVERT(VARBINARY(8), 16777215) 将十六进制转换为整数: SELECT

因此,我在Sybase中使用了此查询(其中,
signal\u data
是一列),但在Microsoft SQL Server中不起作用:

HEXTOINT(SUBSTRING((INTTOHEX(signal_data)),5,2)) as Signal
我在Excel中也有它(其中
A1
包含值):

有人知道我将如何在SQL Server中执行此操作吗?

将INT转换为十六进制:

SELECT CONVERT(VARBINARY(8), 16777215)
将十六进制转换为整数:

SELECT CONVERT(INT, 0xFFFFFF)
更新2015-03-16 上面的示例有一个限制,即它仅在十六进制值作为整数文本给定时才起作用。为完整起见,如果要转换的值是十六进制字符串(例如在varchar列中),请使用:

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


有关更多详细信息,请参阅的“二进制样式”部分。我相信SQL Server 2008或更高版本是必需的。

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

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

例如:

SELECT dbo.ToHex(4095) --> FFF
SELECT 100, master.dbo.fn_varbintohexstr(100)
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
SQL:

创建函数ToHex(@value int)
返回varchar(50)
作为
开始
声明@seq char(16)
声明@result varchar(50)
声明@数字字符(1)
SET@seq='0123456789ABCDEF'
设置@result=SUBSTRING(@seq,(@value%16)+1,1)
而@value>0
开始
设置@digit=SUBSTRING(@seq,((@value/16)%16)+1,1)
设置@value=@value/16
如果@value 0设置@result=@digit+@result
结束
返回@result
结束
去

给定:

declare @hexStr varchar(16), @intVal int
select @hexStr = convert(varbinary, @intVal, 1)
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
inttohextr:

declare @hexStr varchar(16), @intVal int
select @hexStr = convert(varbinary, @intVal, 1)
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
hexstroint:

declare @hexStr varchar(16), @intVal int
select @hexStr = convert(varbinary, @intVal, 1)
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.fn_varbintohextr

例如:

SELECT dbo.ToHex(4095) --> FFF
SELECT 100, master.dbo.fn_varbintohexstr(100)
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
给你


100 0x00000064

传统的4位十六进制非常直接。 十六进制字符串到整数(假设值存储在名为FHexString的字段中):

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

需要注意的重要一点是,当您开始使用导致寄存器共享的位大小时,特别是在intel计算机上,由于intel的小端性质,寄存器中的高、低和左、右将被交换。例如,当使用varbinary(3)时,我们谈论的是6个字符的十六进制。在这种情况下,您的位从右到左配对为以下索引“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))

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

Declare@Dato-xml
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)
Set@Dato=Convert(xml,'FF') 从@Dato.nodes('Dato')中选择Cast(rw.value('xs:hexBinary(text()[1]),'varbinary(max')作为int)作为T(rw)
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

对于我来说,它是一个字体颜色的表达式。Maksym Kozlenko的答案很好,可以稍加修改,将数值编码为任何代码格式。例如:

SELECT dbo.ToHex(4095) --> FFF
SELECT 100, master.dbo.fn_varbintohexstr(100)
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
创建函数[dbo].[IntToAlpha](@Value int)
返回varchar(30)
作为
开始
声明@CodeChars varchar(100)
SET@CodeChars='ABCDEFGHIJKLMNOPQRSTUVWXYZ'
声明@CodeLength int=26
声明@Result varchar(30)=”
声明@数字字符(1)
设置@Result=SUBSTRING(@CodeChars,(@Value%@CodeLength)+1,1)
而@Value>0
开始
设置@Digit=SUBSTRING(@CodeChars,((@Value/@CodeLength)%@CodeLength)+1,1)
设置@Value=@Value/@code长度
如果@Value 0设置@Result=@Digit+@Result
结束
返回@Result
结束
因此,像1.5亿这样的大数字只会变成6个字符(150000000=“MQGJMU”)

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

反之亦然:

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
创建函数[dbo].[AlphaToInt](@Value-varchar(7))
返回整数
作为
开始
声明@CodeChars varchar(100)
SET@CodeChars='ABCDEFGHIJKLMNOPQRSTUVWXYZ'
声明@CodeLength int=26
声明@数字字符(1)
声明@Result int=0
声明@DigitValue int
声明@Index int=0
声明@Reverse varchar(7)
设置@Reverse=Reverse(@Value)
而@Index
将整数转换为十六进制:


SELECT FORMAT(512+255,'X')
要将十六进制字符串转换为INT,我在过去使用过它。它可以修改为将任何基转换为INT(八进制、二进制等)


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

可以使用SQL Server 2012及更高版本上提供的函数格式

select FORMAT(10,'x2')
结果:

0a

Maksym Kozlenko有一个很好的解决方案,其他人接近于释放它的全部潜力,但是完全没有意识到你可以定义任何字符序列,并且使用它的长度作为基础。这就是为什么我喜欢他的解决方案的这个稍微修改的版本,因为它可以用于base 16或base 17,等等

为了