2009-07-02 5 views
0

Ich versuche, ein VARCHAR(MAX) mit Daten darin zu nehmen, wie folgt: „00001001010001010111010101 ...“ usw.Wie kann ich eine zeichencodierte Binärzeichenfolge in SQL Server in Hexadezimal konvertieren?

Dann kodieren sie als hexadezimale für eine effizientere Rückkehr an den Client.

Ist es möglich, dies zu tun? Entweder direkt oder vor dem Aufruf der master.dbo.fn_varbintohexstr die Zeichenfolge in eine echte binäre Spalte konvertieren?

Als Beispiel die Zeichenfolge angegeben:

0000 = 0 
1001 = 9 
0100 = 4 
0101 = 5 
0111 = 7 
0101 = 5 
1110 = E 

094575E:

0000100101000101011101011110 

Wir sollten am Ende mit.

Oder gibt es eine noch effizientere Methode (Binär direkt lesen?), Dann wäre das noch besser. SQL Server 2000 kompatible Lösungen sind vorzuziehen.

+0

ist Ihre einzige Option in der Datenbank? und wird dies auf Anfrage oder einmal ausgeführt werden? –

+1

Würde ... nicht einfach die rohen binären Daten überall effizienter sein als diese Art von Schlangenmanipulation? – Shog9

+0

ist es nicht - aber es wird auf Anfrage und ich würde gerne die über den Draht auf ein Minimum zu halten, wenn möglich. –

Antwort

4

Aufgrund Ihrer vorherigen Frage generieren Sie diese Zeichenfolge als Teil einer anderen Abfrage. Warum auf der Erde erzeugst du eine Folge von Einsen und Nullen, wenn du sie einfach mit der entsprechenden Potenz von 2 multiplizieren kannst, um daraus eine INT anstatt einer Zeichenkette zu machen? Konvertieren von INT in hexadezimale Zeichenfolge ist trivial.

+0

Ich wusste, ich hätte es erklären sollen :) Dies ist im Grunde ein Bitfeld, das "geschwenkt" und verkettet wurde, aber ohne einen Drehpunkt zu verwenden (wie ich innerhalb der Einschränkungen von 2000 weben muss). Ich gebe zu, es sieht verrückt aus - aber gibt es eine Möglichkeit, das trotzdem zu tun? –

+0

Für welche Lösung Sie sich auch entscheiden, dort sollte irgendwo ein Holztisch sein. – TheTXI

+2

@Kieran Benton: Du machst das auf Umwegen.Sie konvertieren von binär zu string, dann möchten Sie von String zu numerisch dann zu Hexadezimalstring konvertieren. Es ist besser, direkt von binär zu numerisch zu konvertieren, so dass Sie es in jeder beliebigen Basis ausgeben können. Sie bauen irgendwie eine Reihe von Zahlen auf. Alles, was Sie tun müssen, ist stattdessen ein INT oder BIGINT zu bauen. Verwenden Sie Addition und Multiplikation statt Verkettung. – Welbog

-1

Suchen Sie etwas wie folgt aus: http://support.microsoft.com/kb/104829

Hier ist es im Fall, dass die Verbindung immer stirbt: (! Ab Ende)

create procedure sp_hexadecimal 
    @binvalue varbinary(255) 
    as 
    declare @charvalue varchar(255) 
    declare @i int 
    declare @length int 
    declare @hexstring char(16) 

    select @charvalue = '0x' 
    select @i = 1 
    select @length = datalength(@binvalue) 
    select @hexstring = "abcdef" 

    while (@i <= @length) 
    begin 

    declare @tempint int 
    declare @firstint int 
    declare @secondint int 

    select @tempint = convert(int, substring(@binvalue,@i,1)) 
    select @firstint = floor(@tempint/16) 
    select @secondint = @tempint - (@firstint*16) 

    select @charvalue = @charvalue + 
     substring(@hexstring, @firstint+1, 1) + 
     substring(@hexstring, @secondint+1, 1) 

    select @i = @i + 1 

    end 

    select 'sp_hexadecimal'[email protected] 
1

Sie können die Zeichenfolge in 4 char Gruppen immer gespalten mit SUBSTRING, und die 4 Char-Gruppen auf die hexadezimale Zahl, z. '0011' bis '3' in einer großen CASE-Anweisung. Es gibt nur 16 Switch Cases im CASE, ist also mehr als überschaubar. Aber alles, was Sie bekommen, ist eine 4-fache Reduzierung der Länge, nicht sicher, ob es den (signifikanten) Server-Overhead wert ist, nur um den Verkehr zu reduzieren.

0

Eine alternative Lösung könnte durch die Implementierung einer benutzerdefinierten Funktion mit Ihrer bevorzugten .NET-Sprache sein

Verwandte Themen