78

したがって、このクエリ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でこれを行う方法を知っている人はいますか?

4

15 に答える 15

127

INT を 16 進数に変換します。

SELECT CONVERT(VARBINARY(8), 16777215)

16 進数を INT に変換します。

SELECT CONVERT(INT, 0xFFFFFF)

2015-03-16 更新

上記の例には、HEX 値が整数リテラルとして指定された場合にのみ機能するという制限があります。完全を期すために、変換する値が 16 進文字列 (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))

注:文字列には偶数の 16 進数が含まれている必要があります。奇数の桁数はエラーになります。

詳細については、CAST および CONVERT (Transact-SQL)の「バイナリ スタイル」セクションを参照してください。SQL Server 2008 以降が必要だと思います。

于 2009-03-31T21:49:33.657 に答える
48

実際には、組み込み関数の名前は master.dbo.fn_varbintohexstr です。

たとえば、次のようになります。

SELECT 100, master.dbo.fn_varbintohexstr(100)

あなたにあげる

100 0x00000064

于 2011-03-02T19:04:53.323 に答える
18

int を 16 進数に変換します。

SELECT FORMAT(512+255,'X')

于 2015-03-20T18:25:59.517 に答える
5

これは、整数値をvarcharとして16進表現に変換するSQLサーバーの関数です。他の種類のデータベースに簡単に適応できるはずです

例えば:

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
于 2009-09-11T04:40:01.880 に答える
5

従来の 4 ビット 16 進数はかなり直接的です。Hex String to Integer (値が FHexString というフィールドに格納されていると仮定) :

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

                    LEFT(FMEID_ESN,8)                       
                ))
                ))

整数から 16 進文字列 (値が FInteger というフィールドに格納されていると仮定):

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

注意すべき重要な点は、特に Intel マシンでレジスタ共有を引き起こすビット サイズを使用し始めると、Intel のリトル エンディアンの性質により、レジスタの High と Low および Left と Right が入れ替わることです。たとえば、varbinary(3) を使用する場合、6 文字の Hex について話しています。この場合、ビットは右から左に「54、32、10」のインデックスとしてペアになっています。intel システムでは、「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 文字の 16 進数 (varbinary(4)) への変換を維持しようとします。

要約すると、これはあなたの質問に答えるはずです。総合的に。

于 2012-02-21T12:52:27.053 に答える
3

master.dbo.fnbintohexstr(16777215)表現に変換するために使用しvarcharます。

于 2009-07-02T10:38:09.130 に答える
2
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)
于 2013-02-06T21:53:50.003 に答える
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 億 5000 万のような大きな数は、わずか 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
于 2014-10-25T22:28:57.210 に答える
2

Maksym Kozlenkoには優れた解決策があり、他の人はその可能性を最大限に引き出すことに近づいていますが、文字の任意のシーケンスを定義し、その長さを Base として使用できることに完全に気づいていません。16 進法や 17 進法などで機能するため、彼のソリューションのこのわずかに変更されたバージョンが気に入っているのはそのためです。

たとえば、文字と数字が必要だが、I が 1 のように見え、O が 0 のように見えるのが気に入らない場合はどうすればよいでしょうか。この方法で任意のシーケンスを定義できます。以下は、I と O をスキップして「変更された base 34」を作成する「base 36」の形式です。16 進数として実行する代わりに、16 進数の行のコメントを外します。

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
于 2019-02-15T17:37:00.583 に答える
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
于 2010-11-24T00:00:35.557 に答える
0
IIF(Fields!HIGHLIGHT_COLOUR.Value="","#FFFFFF","#" & hex(Fields!HIGHLIGHT_COLOUR.Value) & StrDup(6-LEN(hex(Fields!HIGHLIGHT_COLOUR.Value)),"0"))

フォントの色の表現として私のために働いています

于 2013-11-12T14:48:08.953 に答える
0

以下に、dbo.HexToInt と dbo.IntToHex の 2 つの関数を示します。このような変換に使用します。

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

そして2番目のもの:

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
于 2015-05-21T10:02:00.577 に答える