StringHex_to_INT

Tobi
2007-09-27
2007-10-02
  • Tobi - 2007-09-27

    Hallo zusammen.

    Ich suche eine Funktion, die einen beliebiegen String aus Hex-Zeichen zu einem INT Wert macht. Entweder bin ich blind, oder das gibt es wirklich noch nicht. In Oscat gibt es DWORD_TO_STRH - das ist halt falsch herum.

    Also in etwa:

    testString := 'AB04';

    i := INT;

    i := StringH_To_Int ( testString ); ( i= 43780 )

    Ideen?

    Grüße,

    Tobi

     
  • Oberchefe - 2007-09-27
    FUNCTION_BLOCK StringToDword
    VAR_INPUT
       InputString:   STRING(9);
    END_VAR
    VAR_OUTPUT
       NoNumber:      BOOL;
       StringToDword :    DWORD;
    END_VAR
    VAR
       Char:            STRING(1);
       Wert:             INT;
       Pt_1:             POINTER TO BYTE;
       i:                INT;
    END_VAR
    
    StringToDWORD:=0;
    NoNumber:=FALSE;
    IF LEN(InputString) > 8 THEN
    NoNumber:=TRUE;
    END_IF
    FOR i:= 0 TO (LEN(InputString)-1) DO
       Char:=MID(Inputstring, 1, i+1);
       Pt_1:=ADR(Char);
       StringToDWORD:=SHL(StringToDWORD,4);
       Wert:=DWORD_TO_BYTE(Pt_1^);
          CASE Wert OF
          48..58:
                StringToDWORD:=StringToDWORD+INT_TO_DWORD(Wert-48);
          65..70:
                StringToDWORD:=StringToDWORD+INT_TO_DWORD(Wert-55);
          97..102:
                StringToDWORD:=StringToDWORD+INT_TO_DWORD(Wert-87);
          ELSE
             NoNumber:=TRUE;
    END_CASE
    END_FOR
    
     
  • Oberchefe - 2007-09-30

    anbei als Lib (geringfügig modifiziert und mit ein paar Kommentaren versehen).

    HexStringToDword.zip [1.37 KiB]

     
  • Tobi - 2007-10-01

    Danke, Danke. So hatte ich mir das auch schon gedacht - komisch nur, dass das in keiner 'umfangreichen' Lib (Oscat?) implemetiert ist. Das konnte ich halt nicht glauben und habe mir da Blindheit unterstellt - aber es ist wohl tatsächlich so.

    Wie gesagt, danke schön!

     
  • hugo - 2007-10-01

    warum ist hex_to_int nicht in oscat?

    wir hatten uns bisher nicht gedacht das jemand so eine fumktion benötigt, wozu brauchst du sowas eigentlich?

     
  • Tobi - 2007-10-02

    Ich habe mittlerweile auch noch einen anderen Ansatz probiert - der baut aber auf dem gleichen Prinzip auf.

    Ich verwende das, um auf einem HMI per Touchscreen hexwerte einzugeben, die ich aber auch als Base10-Zahl anzeigen lassen will.

    Mich hatte das halt nur verwundert, dass die umfangreiche Oscat das nicht bietet.

    Nun wende ich bei jeden Tastendruck ein SHL und ein AND auf meien bisherigen INT-Wert an. klappt auch.

    Danke & Gruß

     
  • hugo - 2007-10-02

    Hallo Tobi,

    dein Argument mit der HExadezimaltastatur hat uns nun doch überzeugt.

    in der 2.2. wird die funktion enthalten sein.

    anbei der code:

    FUNCTION HEX_TO_DWORD : INT

    VAR_INPUT

    Hex : STRING;
    

    END_VAR

    VAR

    pt : POINTER TO BYTE;
    
    i: INT;
    
    X: BYTE;
    

    END_VAR

    (*

    version 1.0 6 oct 2006

    programmer hugo

    tested by tobias

    HEX_TO_DWORD converts a Hexadecimal string into a DWORD.

    pt := ADR(hex);

    FOR I := 0 TO LEN(hex) - 1DO

    x := pt^ - 48;
    
    IF X > 9 THEN X := X - 7; END_IF;
    
    HEX_TO_DWORD := SHL(HEX_TO_DWORD,4) + X;
    
    pt := pt + 1;
    

    END_FOR

    (* revision histroy

    hm 2.10.2007 rev 1.0

    original release
    

    *)

     
  • Tobi - 2007-10-02

    Hehe - schöne Sache!

     

Log in to post a comment.