Announcement

Collapse
No announcement yet.

Binary[200] Mit Hex Zahlen

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Binary[200] Mit Hex Zahlen

    Hallo an Alle,

    da der alte Thread wohl ins falsche rausgelaufen ist, mach ich hier lieber mal nen neuen auf. Also bei mir geht es um folgendes: Ich habe in einer Datenbank eine Spalte mit Hex Zahlen, diese in Binary abgespeichert sind. Ich möchte nun diese Zahlen immer Segmentweise auslesen. D.h. es ist eine große binary datei mit 200 einträgen, und ich möchte immer nur 4 daraus. haben.
    Zwei zusammenstehende von diesen 4 möchte ich dann mit den anderen 2 vertauschen und dann alle 4 in dezimalsystem umwandeln. Und das dann für alle 200 einträge. Dann möchte ich, dass diese Spaltenweise immer abgespeichert werden (heisst also jede 4er Kombination in einer eigenen Spalte steht)

    hier ein kleines Beispiel


    Hex kette 20485821943849329048FFFFFFFFFF43824207340203472000 00
    Die ersten 4 Zahlen: 2048
    Vertauschen: 4802
    in dez umwandeln: 18434

    Wäre schön wenn mir jemand helfen könnte!

    Grüße

  • #2
    [HIGHLIGHT="SQL"]IF ( SELECT OBJECT_ID ('dbo.HexToint') ) IS NOT NULL DROP FUNCTION dbo.HexToint;
    IF ( SELECT OBJECT_ID ('dbo.Nums') ) IS NOT NULL DROP Function.dbo.Nums;
    GO
    CREATE FUNCTION dbo.nums ()
    RETURNS TABLE RETURN
    (
    WITH n0 (n) AS ( SELECT 1 UNION ALL SELECT 1 UNION ALL SELECT 1 UNION ALL SELECT 1 )
    , n1 (n) AS ( SELECT n0.n FROM N0 AS N1 CROSS JOIN n0)
    , n2 (n) AS ( SELECT n1.n FROM N1 AS N2 CROSS JOIN n1)
    , n (n) AS ( SELECT ROW_NUMBER() OVER( ORDER By (SELECT NULL) ) FROM N2 )
    SELECT n As Num FROm n
    );
    GO
    SELECT * FROm dbo.Nums ();
    GO
    CREATE FUNCTION dbo.HexToInt
    ( @Hex NVARCHAR (20)
    ) RETURNS INT AS
    BEGIN
    DECLARE @Result INT;
    SET @Result = 0;
    SELECT @Result = ( @Result * 16)
    + (CHARINDEX (SUBSTRING (@Hex, Num, 1), '0123456789ABCDEF') -1)
    FROM dbo.Nums ()
    WHERE Num <= LEN (@Hex)
    AND SUBSTRING (@Hex, num, 1) LIKE '[0-9ABCDEF]';
    RETURN @Result;
    END;
    GO
    DECLARE @Bin BINARY (50);
    DECLARE @Var VARCHAR(MAX);
    SET @Bin = CONVERT (BINARY(50),'20485821943849329048FFFFFFFFFF4382420 7340203472000');
    SET @Var = CONVERT (VARCHAR(MAX),@Bin);
    SELECT @BIN AS Hex
    , @Var AS Str
    , LEFT(@Var,4) AS LeftS
    , RIGHT(LEFT(@Var,4),2)+LEFT(@Var,2) AS Change
    , dbo.HexToInt(RIGHT(LEFT(@Var,4),2)+LEFT(@Var,2)) AS Integer

    IF ( SELECT OBJECT_ID ('dbo.HexToint') ) IS NOT NULL DROP FUNCTION dbo.HexToint;
    IF ( SELECT OBJECT_ID ('dbo.Nums') ) IS NOT NULL DROP Function.dbo.Nums;[/HIGHLIGHT]

    Comment


    • #3
      Dankeschön, aber was mich nun auch zum Ziel geführt hat waren eine Funktion die ich selbst implementiert habe und zum Auslesen der HEX Werte (also quasi damit da hex werte, und nicht dieses blöde <object> steht
      Code:
      master.dbo.fn_varbintohexstr(binary)
      Deinen Code werde ich aber dennoch ausprobieren damit ich sehe, ob er zum gewünschten ziel führt :-)

      Comment


      • #4
        Ohman jetzt kommt der hammer :-S Ich soll beachten,wenn am Anfang im Binärcode eine 1 steht(also sozusagen ein Vorzeichenbit). Wenn das nämlich der Fall ist, dann ist diese Zahl negativ... Ich bin jetzt grad ein wenig verwirrt. Kann mir da jemand helfen?

        Ein Beispiel:
        0001 wäre eine 0000000000000001 in Binär und es steht keine 1 am Anfang -> damit keine negative Zahl
        FFF6 entspricht 1111111111110110 und ist damit eine negative Zahl. Ergebnis ist -10 also das bitte auch in SQL schreiben. Kann mir da jemand helfen?

        Comment


        • #5
          Wenn du mal in Wiki oder einem sonstigen Werk die Komplementbildung nachliest sollte dir auffallen das man die vorzeichenlose Darstellung simpel in die vorzeichenbehaftete umrechen kann. Dein Verfahren soltle so wie es jetzt ist also schon richtig sein da fehlt nur noch eine kleine Umrechnung des Ergebnisses. Wie genau überlassen wir dem Fragesteller mal als Übung

          Comment

          Working...
          X