C Code zu VB (ASCII To Hex-Funktion)

  • VB.NET

Es gibt 21 Antworten in diesem Thema. Der letzte Beitrag () ist von RodFromGermany.

    C Code zu VB (ASCII To Hex-Funktion)

    Hallo,

    ich habe in C eine Funktion, um ASCII-Zeichen (z.B. 0x4F3C) in HEX umzuwandeln. Nun brauch ich sowas in VB und bin dabei, dies in VB zu machen, jedoch gelingt mir das überhaupt nicht. Vorallem bei der For-Schleife scheitere ich. Seltsam, wenn C leichter ist als Basic ^^

    Im moment verwende ich das in C:

    XML-Quellcode

    1. unsigned int ASCIItoHEX( char *str )
    2. {
    3. unsigned int value = 0;
    4. for(;; ++str ) switch( *str )
    5. {
    6. case '0': case '1': case '2': case '3': case '4':
    7. case '5': case '6': case '7': case '8': case '9':
    8. value = value << 4 | *str & 0xf;
    9. break;
    10. case 'A': case 'B': case 'C': case 'D': case 'E': case 'F':
    11. case 'a': case 'b': case 'c': case 'd': case 'e': case 'f':
    12. value = value << 4 | 9 + *str & 0xf;
    13. break;
    14. default:
    15. return value;
    16. }
    17. }


    Meine hauptfrage ist, wie die for-schleife (der anfang, nicht das, was es dann ausführt) aussehen sollte. Habe einige Examples schon angeguckt, aber die helfen nicht wirklich... :/

    mfg

    gfcwfzkm
    Ich würde nach einer fertigen, alternativen Lösung suchen, nicht versuchen C in VB.Net zu übersetzten.

    Vielleicht hilft das:
    stackoverflow.com/questions/86…ex-to-ascii-like-in-excel
    stackoverflow.com/questions/14…exadecimal-value-to-ascii
    Mfg
    Vincent

    Nimm einfach die Integer.Parse- bzw. Integer.TryParse-Methode:

    VB.NET-Quellcode

    1. Dim str As String = "ff";
    2. Dim int As Integer = Integer.Parse(str, System.Globalization.NumberStyles.HexNumber)


    Seltsam, wenn C leichter ist als Basic

    Wenn man davon ausgeht, dass es die genannte Funktion nicht gäbe, ließe sich das Problem tatsächlich mit C "eleganter" lösen.

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Infinity“ ()

    =D Danke Infinity, das ist es. Ja, kenne C inzwischen besser als VB ^^

    @ErfinderDesRades ASCII to HEX und das in einer Int-Variable speichern. Und C hat auch fertige Funktionen (atoi bzw. itoa) aber bei einem Programmspeicher von 2048Bytes und einer RAM von 128Bytes (Microcontroller Kommuniziert mit PC) muss ich halt aufpassen und kann keine RiesenC-Funktion hinterher ziehen ^^

    #VincentTB meinte ASCII to Hex, nicht Hex to ASCII, aber danke trotzdem, die Threads werden mir gut weiterhelfen :)

    mfg

    gfc
    Nur als Anmerkung zu dem C Code...

    Quellcode

    1. unsigned int ASCIItoHEX( char *str )
    2. {
    3. unsigned int value = 0;
    4. while (++str)
    5. {
    6. if (*str >= '0' && *str <= '9')
    7. value = value << 4 | (*str-'0') & 0xf;
    8. else if(*str>= 'A' && *str<= 'F')
    9. value = value << 4 | 9 + (*str-'A') & 0xf;
    10. else if(*str >='a' && *str<= 'f')
    11. value = value << 4 | 9 + (*str-'a') & 0xf;
    12. else
    13. return value;
    14. }
    15. }

    oder die while schleife so:

    Quellcode

    1. while(1)
    2. {str++;//++str

    wobei das oben zwar funktionieren würde aber nicht unbedingt schön ist.
    Aufjedenfall wäre der Code so schonmal performanter kürzer und auch schöner

    Edit: Mir fällt gerade auf, dass dein Code doch gar nicht funktionieren kann? Da fehlt die Umwandlung von ASCII zu ner zahl
    Deshalb oben etwas abgewandelt nochmal
    Ich wollte auch mal ne total überflüssige Signatur:
    ---Leer---

    gfcwfzkm schrieb:

    ASCII to HEX und das in einer Int-Variable speichern.
    also Hex ist überhaupt kein Datentyp, und um String nach Integer zu konvertieren benutze die Integer.Parse-Funktion.

    VB.NET-Quellcode

    1. Dim eleven As Integer = Integer.Parse("B", Globalization.NumberStyles.AllowHexSpecifier)

    gfcwfzkm schrieb:

    Nun brauch ich sowas in VB
    Hab auch nicht ganz verstanden, was Du willst.
    Sieh Dir mal das hier an:

    VB.NET-Quellcode

    1. Dim i1 = 12345
    2. Dim txt = i1.ToString("X")
    3. Dim i2 = Convert.ToInt32(txt, 16)
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Ich muss bei mir auch 4 Byte ID im Hexformat einlesen und konvertiere es so:

    VB.NET-Quellcode

    1. Dim n As UInt32= ToUInt32(txtID.Text, 16)'UInt32, weil 4 Byte


    @Rod Ich glaube, es muss Unsigned Integer sein, sonst gibt es Chaos.

    sonne75 schrieb:

    es muss Unsigned Integer sein
    Nö, es geht mit beiden.
    Signed oder Unsigned ist eine Frage der Verwendung, nicht aber der Zeichen, die da stehen.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Ich habe jetzt getestet:
    Wenn ich "FF010101" konvertiere, bekomme ich bei Int32 -16711423 und bei UInt32 4278255873.
    Wenn man diese Zahl dann weiter bearbeiten muss (ich muss schauen, dass ID in bestimmter Range liegt), dann funktioniert es mit Int32 nicht.

    EDIT: Int32 nutzt das höherwertigste Bit für Vorzeichen und kann deswegen nur bis zur Hälfte der Range von UInt32 gehen...

    sonne75 schrieb:

    und kann deswegen nur bis zur Hälfte der Range von UInt32 gehen...
    Da fehlen Dir wohl ein paar Grundlagen?
    Gugst Du

    VB.NET-Quellcode

    1. Dim i1 = Integer.MinValue
    2. Dim i2 = Integer.MaxValue
    3. Dim i3 = UInteger.MinValue
    4. Dim i4 = UInteger.MaxValue

    -2147483648 .............. 0 ................... 2147483647 ............... 4294967295
    |--------------------------|--------------------------|--------------------------|
    |.......................Integer.......................|
    ___________________________|......................UInteger.......................|
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Genau das Gleiche habe ich auch gesagt. Int32 geht von -31Bit bis +31 Bit, UInt32 von 0 bis 32 Bit. Wenn der String im Hexformat vorne eine 1 hat (also ab 8 vorne), dann kommt ein Minuszeichen bei Int32.

    EDIT: Mit der "Range" habe ich mich falsch ausgedrückt, mir ging es um den Maximumwert. natürlich ist Range in beiden Fällen 32 Bit.

    EDIT2: Natürlich erst ab einer 8 vorne, wenn es 8 Zeichen String ist, also wie 80AA7654

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „sonne75“ ()

    nafets3646 schrieb:

    Ein int32 sollte aber von -16Bit - 16Bit gehen?
    Hä?

    sonne75 schrieb:

    Int32 geht von -31Bit bis +31 Bit
    ist doch völlig korrekt, 2 * (31 Bit) = 32 Bit.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Interessant, wie sich der Thread so entwickelt hat ^^

    @jvbsl Doch, der Code funktioniert. Danke für die Performance-tipps, die werde ich umsetzten. Bei 4Mhz CPU-Takt ist jedes Hz wichtig (vorallem wenn man noch mit UART und I2C-BUS kommuniziert :D )

    @ErfinderDesRades Ist mehr Umgamgssprachlich gemeint. In C definiere ich einfache Variablen und Register direkt in Hex (sehe allgemein viele Hex-Werte in C), deswegen hab ich versehentlich eine Umwandlung in Hex verlangt. Korrekt wäre da wohl ASCII in Binärcode? ?(

    In VB find ich das Programmieren mit Zeichenketten (Strings) toll. Aber sobald es in Richtung Integer und co geht, bevorzuge ich da lieber C ;)

    mfg

    gfc