String to Hex

  • VB.NET
  • .NET (FX) 4.5–4.8

Es gibt 6 Antworten in diesem Thema. Der letzte Beitrag () ist von Niko Ortner.

    String to Hex

    Hallo.

    Ich würde gerne einen String zu Hex umwandeln.

    Folgende Funktion habe ich:

    VB.NET-Quellcode

    1. Private Function StringToHex(T As String) As String
    2. Return String.Concat("0x", String.Join(String.Empty, T.ToCharArray.Select(Function(d) AscW(d).ToString("x"))))
    3. End Function


    Ersteinmal stört mich das AscW , da Vb6. Habe Convert.ToInt16 und Convert.ToInt32 probiert -> Klappt nicht.

    Gibt es da möglicherweise generell eine bessere Lösung für?
    Definiere

    Daniel Baumert schrieb:

    String zu Hex
    denn Hex ist ein String.
    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!

    VB.NET-Quellcode

    1. Dim x = System.Text.Encoding.ASCII.GetBytes("MyTestString")
    2. Dim xx = "0x"
    3. For Each b In x
    4. xx &= " " & b.ToString("X2")
    5. Next
    geht bestimmt auch noch eleganter
    --
    If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
    --

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

    Dem würde ich gerne noch was anfügen.

    Was bisher alle dieser "Konvertierungs"-Seiten gemeinsam haben ist, dass sie Daten, Encodings und Repräsentationen wild durcheinander würfeln und dann einfach kreuz und quer durch die Gegend konvertieren. Meistens kommt das heraus, was man haben will, aber das kann auch in die Hose gehen. (Wenn ich sowas sehe, dreht sich mir der Magen um.)
    Lies Dir auch hier den ersten Absatz zur Repräsentation von Zahlen durch.

    Daten:
    Das sind die rohen Informationen. Egal, wie die später repräsentiert werden, bleibt die Information die gleiche. Wenn Du einen Bleistift nimmst, und davon die Länge betrachtest, dann hat der genau die Länge, die er hat.
    Ein anderes Beispiel für Daten wären Zeichenfolgen, also mit anderen Worten Strings. Ein großer Buchstabe "H", gefolgt von einem kleinen Buchstaben "a", gefolgt von zwei kleinen Buchstaben "l", gefolgt von einem kleinen Buchstaben "o". Das ist eine Zeichenfolge. Und egal, wie Du diese repräsentierst, es wird immer Hallo bleiben.

    Repräsentationen:
    Die braucht man, damit man Daten kommunizieren kann. Du kannst mir schlecht erklären, wie lang Dein Bleistift ist, wenn wir uns nicht auf eine Repräsentation einigen bzw. wenn Du mir nicht sagst, welche Repräsentation Du verwendest. Wenn Du einfach nur "15" hinschreibst, kann ich mir zwar denken, dass das wahrscheinlich die Zahl fünfzehn, dargestellt im dezimalen Zahlensystem, ist. Aber das alleine reicht ja noch nicht. Du müsstest schreiben "", und dann wüsste ich genau, Du meinst Dreizehn, dargestellt im oktalen Zahlensystem, und die Einheit "Handbreit" (Keine Ahnung, hab die nur vom Windows-Rechner).
    Ähnlich verhält es sich mit dem Zeichenfolgen-Beispiel. Dein Computer (oder eigentlich der Server von VBP) kann meinem Computer gerne diese Bytefolge senden: 72 97 108 108 111 (beachte, dass das auch wiederum Repräsentationen sind, nämlich die dezimal dargestellten Werte der Bytes), aber wenn nicht klargestellt wird, wie diese Bytes Deinen Text repräsentieren, dann zeigt mir mein Computer im besten Fall Zeichensalat an.

    Encodings:
    Das sind vorher ausgemachte Konventionen, die festlegen, wie Daten repräsentiert werden. Die sind ganz besonders wichtig, wenn man mit Zeichenfolgen arbeitet.
    Beispielsweise legt das ASCII-Encoding fest, dass der große Buchtabe "H" durch ein Byte mit dem Wert zweiundsiebzig repräsentiert wird.
    Oder UTF-16 legt fest, dass der "arabische Buchstabe Lam mit drei Punkten oben", der übrigens so: ڷ aussieht, als zwei Bytes repräsentiert wird, nämlich sechs, gefolgt von hundertdreiundachzig.

    Das Ganze jetzt angewendet auf Dein Problem:
    "String zu Hex umwandeln" ergibt jetzt erst mal nicht wirklich Sinn. Du müsstest genauer definieren, was Du damit meinst.
    Was ich jetzt rausinterpretiert hätte (und wohl auch petaod und ErfinderDesRades), wäre folgendes:
    String mit Encoding (z.B. ASCII) zu Bytes. Bytes in hexadezimale Repräsentation bringen. Alles in einen String hintereinanderhängen.
    Oder konkret: "Hallo" -> {72, 97, 108, 108, 111} -> {"48", "61", "6c", "6c", "6f"} -> "48616c6c6f" -> "0x48616c6c6f"

    Eine Hürde, die sich hier hätte ergeben können, wäre, dass z.B. die Repräsentation von manchen Bytes nur ein Zeichen lang ist. Das ist in diesem Fall zwar extrem unwahrscheinlich, weil das nur bei ein paar Steuerzeichen passiert, aber wenn Du z.B. beliebige Bytes in diese Darstellung bringen möchtest, wird das zu einem Problem. Durch das "2" in .ToString("X2") wird angegeben, dass der String auf eine Länge von 2 Zeichen aufgefüllt werden soll. In diesem Fall mit Nullen links.

    Nachtrag:
    Das Thema war ja eigentlich schon erledigt, aber in den letzten Tagen habe ich mehrmals gesehen, dass "fahrlässig mit Daten hantiert wurde". Ich verlinke dann in Zukunft einfach auf diesen Post.
    "Luckily luh... luckily it wasn't poi-"
    -- Brady in Wonderland, 23. Februar 2015, 1:56
    Desktop Pinner | ApplicationSettings | OnUtils