2016-12-20 4 views
1

Ich muss Zeichen in einer Zeichenfolgendarstellung einer hexadezimalen Zahl neu anordnen. Hier ist ein Beispiel für eine Eingabe (obere Zeichenfolge) und das gewünschte Ergebnis (untere Zeichenfolge). enter image description here Hexadezimale Zeichenfolge in T-SQL neu anordnen

Ich habe hier Code aus diesem Kerl entlehnt: http://dpatrickcaldwell.blogspot.hr/2009/05/converting-decimal-to-hexadecimal-with.html Danke, Mann! Das sollte für mich eine Dez-zu-Hex Konvertierung sein, und es funktioniert, ich habe es getestet.

hier ist jetzt mein T-SQL-Code, der das Bewegen um die Teile Teil behandeln soll:

CREATE FUNCTION DecodeDecKeyCard 
(
    @value AS BIGINT 
) RETURNS CHAR(8) AS BEGIN 
    DECLARE @convertedNum VARCHAR(MAX), 
      @result CHAR(8) = '', 
      @flag INT = 1, 
      @loop INT = 4; 
    SELECT @convertedNum = dbo.ConvertToBase(@value, 16); 
    WHILE @loop > 0 
     BEGIN 
      SELECT @result = @result + SUBSTRING(@convertedNum, (@loop*2) - @flag, 1); 
      IF(@flag = 1) 
       SET @flag = 0; 
      ELSE 
       SET @flag = 1; 
       SET @loop = @loop -1; 
     END 
    RETURN @result 
END 

Da ich eine komplette Noob bin, wenn es um SQL kommt, ich weiß nicht, wie dies zu debuggen. Ich habe ein paar Sachen darüber gegoogelt, aber die Ergebnisse verweisen mich immer wieder auf bezahlte Versionen von VS und einige Hacks oder was auch immer ... Um ehrlich zu sein, bin ich knapp bei der Zeit (und dem Geld), um das selbst einzurichten im Augenblick.

Einige Dinge zu dem obigen Code verwendet:

  • Ich weiß, dass ich immer eine 10-stellige Dezimalzahl als Parameter wird in einer 8-stelligen Hex-Zahl immer führt
  • Ich weiß, erhalten
  • dbo.ConvertToBase ist die bereits erwähnte ‚ausgeliehen‘ Funktion

EDIT: Der Code, den ich im Moment führt zu keinen Daten zurückgegeben zu werden ... Die hex-Zahl ist t von Anfang an als String wiedergegeben.

Ich möchte es wies wieso mein Code nicht funktioniert?

+0

Ihre Funktion funktioniert also nicht wie erwartet? Sie sagten, Sie erhalten einen 10-stelligen Eingang, zeigen aber einen 8-stelligen Eingang. hast du einfach die 0x fallen lassen? – scsimon

+0

Die Hexadezimalzahl wird nie als INT behandelt, also ist 0x unnötig. Ich werde die Frage so bearbeiten, dass sie klarer ist. – Jakov

+0

Entschuldigung, ich habe gerade herausgefunden, was du meintest. Das Argument, das die Funktion empfängt, ist eine 10-stellige lange Zahl. ** Diese Nummer wird dann in eine 8-stellige Hexadezimalzahl umgewandelt, die als String ** dargestellt wird. Und dann wird diese Nummer in der im Bild gezeigten Weise neu angeordnet. – Jakov

Antwort

1
--10 CHARACTER INPUT 
declare @input varchar(10) = '0xD2CF901A' 

SELECT RIGHT(RIGHT(@input,8),2) + SUBSTRING(RIGHT(@input,8),5,2) + SUBSTRING(RIGHT(@input,8),3,2) + LEFT(RIGHT(@input,8),2) 

--8 CHARACTER INPUT 
declare @input varchar(10) = 'D2CF901A' 

SELECT RIGHT(@input,2) + SUBSTRING(@input,5,2) + SUBSTRING(@input,3,2) + LEFT(@input,2) 
3

Binary style:

declare @value   int  = 1234567890 
declare @value_bytes binary(4) = cast(@value as binary(4)) 
declare @swapped_bytes binary(4) = cast(reverse(@value_bytes) as binary(4)) 

select 
    @value_bytes [Input], 
    @swapped_bytes [Output], 
    convert(char(8), @swapped_bytes, 2) [As text] 

Für:

Input  Output  As text 
0x499602D2 0xD2029649 D2029649 

UDF:

create function DecodeDecKeyCard (@value as int) returns char(8) 
as 
begin 
    return convert(char(8), cast(reverse(cast(@value as binary(4))) as binary(4)), 2) 
end 

(Dieser rechnet den Wert nicht für eine 32-Bit-Ganzzahl, die max übersteigt, Wenn es bigint verwenden kann, binary(8) und char(16))

+0

Sie haben eine Rückgabe und Variable als' char' deklariert, die ein * single * Zeichen ist, da Sie keine Größe haben ('char (8)')), UDF oben hinzugefügt. –