signed HEX nach Double

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

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

    signed HEX nach Double

    Hallo,

    vermutlich so trivial, dass es schmerzt, aber ich stehe gerade auf dem Schlauch:
    Ich will den bösen VB Code durch den guten VB.NET erstezen.
    Jetzt habe ich eine Zeile Code:

    VB.NET-Quellcode

    1. _d = Microsoft.VisualBasic.Val("&H" & (s))

    Mit s = "1234" wird _d = 4660.0
    Mit s = "edcb" wird _d = -4661.0
    Jetzt suche ich eine Entsprechung in vb.net
    Mit

    VB.NET-Quellcode

    1. Convert.ToInt64(s, 16)
    kann ich s hexdezimal interpretieren und einen Integer daraus machen.
    Aber ich bekomms irgdendwie nicht auf double und schon gar nicht mit Vorzeichen.
    ich wüsste nicht, dass man im Hex-Format negative oder Fliesskommazahlen darstellen könnte.
    Ich verstund Hex immer als kompakte Darstellung von Bytes, also 2 Hex-Digits repräsentieren ein Byte.
    Mit bischen Übung kann man dann aus mw &HA32F ablesen, wo in diesem UShort die Bits gesetzt sind.
    (naja, mit viel Übung, und ich kanns nicht)
    Wenn du auf den Umweg über das Double verzichtest.

    VB.NET-Quellcode

    1. Dim num = &H1234
    2. Dim hex = ToHex(num)
    3. Dim number = FromHex(hex)


    VB.NET-Quellcode

    1. ​Private Function ToHex(number As Int32) As String
    2. Return $"&H{Convert.ToString(number, 16)}"
    3. End Function
    4. Private Function FromHex(hexstring As String) As Int32
    5. Dim hex = hexstring.Replace("&H", String.Empty)
    6. Return Convert.ToInt32(hex, 16)
    7. End Function


    Freundliche Grüsse

    exc-jdbi
    Die Hexadezimaldarstellung geht einfach mit

    VB.NET-Quellcode

    1. Dim txt = number.ToString("X")
    2. Dim txt2 = number.ToString("X2")
    3. Dim txt3 = number.ToString("X4")
    4. Dim txt4 = number.ToString("X8")
    Zurück hast Du die korrekte Darstellung.
    Das ganze funktioniert auch mit Long.
    Innerhalb eines VB-Programms würde ich bei ToHex() nicht unbedingt mit "&H" arbeiten, da dies die Hex-Kennung für den VB-Quelltext ist.
    In C# ist das "0x".
    Wenn jemand das Programm nach C# überträgt, ist das ein großes Potenzial für Exceptions.
    Man sollte also überlegen, dies dynamisch zu organisieren: bei FromHex() könnten beide Suffixe eliminiert werden.
    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!
    Du solltest mal überlegen ab welcher Zahl ein singed Integer negativ wird.

    Wann bei 8, 16, 32, 64 Bit?

    VB.NET-Quellcode

    1. Dim s As String
    2. Dim d As Double
    3. s = "1234"
    4. d = System.Convert.ToInt16(s, 16)
    5. Debug.Print(d.ToString)
    6. s = "edcb"
    7. d = System.Convert.ToInt16(s, 16)
    8. Debug.Print(d.ToString)
    9. d = System.Convert.ToInt32(s, 16)
    10. Debug.Print(d.ToString)



    Ergenis:

    Quellcode

    1. 4660
    2. -4661
    3. 60875

    @Eierlein Vorschlag:
    Sie sind negativ, wenn sie kleiner als 0 sind. :thumbsup:
    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!
    Sorry, mein Fehler. Ich hab mich so lange im Kreis gedreht bis ich es selbst nicht mehr verstanden habe.
    Double als Ergebnis ist natürlich hier Quatsch.
    Interessanter Weise wird der 16Bit Hex-Wert bei der "bösen" VB Val() Funktion aber vorzeichenrichtig interpretiert und das Ergebnis ist signed.
    Daher war hier wohl 'Double' verwendet und ich habe mich vom Ergebnis 'Double' einlullen lassen.
    Diese alte Zeile Code habe ich nicht geschrieben, sondern von einem Kollegen übernommen, was hier keine Rechtfertigung sein soll.
    Richtig ist natürlich, dass das Ergebnis ein signed Integer sein soll.
    "1234"(h) => 4660(d)
    "edcb"(h) => -4661(d)
    Bzw. hier "short", weil nur 16 Bit.

    VB.NET-Quellcode

    1. Dim i6 As Short = Convert.ToInt16(s, 16)

    löst das Problme

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

    @roepke Du musst das MSB testen.
    Bei 16 Bit ist das das Bit mit dem Wert 32768 bzw. &H8000.
    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!

    roepke schrieb:

    Aber wie mache ich das bei nur 12 Bit?
    Da heißt die Zauberzahl 2048 (&H800).
    Die Operation dazu ist:
    1 << 12
    bzw.
    1 << 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!