Преобразовать целое число в шестнадцатеричное и шестнадцатеричное в целое - PullRequest
72 голосов
/ 01 апреля 2009

Итак, этот запрос работает (где 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?

Ответы [ 15 ]

104 голосов
/ 01 апреля 2009

Конвертировать 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 или более поздняя версия.

43 голосов
/ 02 марта 2011

На самом деле встроенная функция называется master.dbo.fn_varbintohexstr.

Так, например:

SELECT 100, master.dbo.fn_varbintohexstr(100)

Дает вам

100 0x00000064

25 голосов
/ 03 мая 2013

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
12 голосов
/ 20 марта 2015

Преобразовать int в гекс:

SELECT FORMAT(512+255,'X')

7 голосов
/ 27 апреля 2017

Это возможно с помощью функции FORMAT, доступной в SQL Server 2012 и выше

select FORMAT(10,'x2')

Результат:

0a
5 голосов
/ 21 февраля 2012

Традиционный 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
                ))))

Важно отметить, что, когда вы начнете использовать битовые размеры, которые вызывают совместное использование регистров, особенно на компьютере Intel, ваши Высокие и Низкие и Левые и Права в регистрах будут поменяться местами из-за порядкового номера Intel. Например, при использовании varbinary (3) мы говорим о шестнадцатеричном Hex. В этом случае ваши биты соединяются в виде следующих индексов справа налево "54,32,10". В системе Intel вы ожидаете «76,54,32,10». Поскольку вы используете только 6 из 8, вы должны помнить, чтобы сделать обмены самостоятельно. «76,54» будет считаться вашим левым, а «32,10» - вашим правом. Запятая разделяет ваш максимум и минимум. Intel меняет взлеты и падения, затем налево и направо. Итак, чтобы сделать преобразование ... вздох, вы должны поменять их сами, например, следующее преобразует первые 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

                )))
                ))

Это немного сложно, поэтому я постараюсь сохранить свои преобразования в шестнадцатеричных гексах (varbinary (4)).

В целом, это должно ответить на ваш вопрос. Обширное.

5 голосов
/ 11 сентября 2009

Вот функция для 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
2 голосов
/ 26 октября 2014

Ответ Максима Козленко хорош и может быть немного изменен, чтобы обрабатывать кодирование числового значения в любом формате кода. Например:

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

Таким образом, большое число, например 150 миллионов, становится всего 6 символами (150 000 000 = "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
2 голосов
/ 07 февраля 2013
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)
2 голосов
/ 02 июля 2009

Используйте master.dbo.fnbintohexstr(16777215) для преобразования в varchar представление.

...