Short2Integer bzw. Übernahme aus VB6 in .net

  • VB.NET

Es gibt 7 Antworten in diesem Thema. Der letzte Beitrag () ist von pino.

    Short2Integer bzw. Übernahme aus VB6 in .net

    Hallo liebe Gemeinde,

    ich bin mit Visual Studio 2019 und VB unterwegs. Es gibt ein altes Programm welches noch unter VB6 lief was ich jetzt gerne in .net weiter laufen lassen würde.

    Ich komme eigentlich gut zu recht, aber verzweifle an einer Routine, da diese ungewöhnlich viel Zeit benötigt und hoffe das mir einer helfen kann.

    Das Programm ließt eine Binär-Datei ein und wertet dann die entsprechenden Daten aus.

    Folgendes kommt aus VB6 und benötigt so lange:

    VB.NET-Quellcode

    1. Public Function Short2Integer(str As String, unsigned As Boolean) As Long
    2. Dim HiByte, LoByte As Byte
    3. HiByte = Asc(str.Substring(0, 1))
    4. LoByte = Asc(str.Substring(str.Length - 1))
    5. If HiByte And &H80 Then
    6. Short2Integer = (HiByte And &H7F) * &H100& Or LoByte Or &H8000
    7. Else
    8. Short2Integer = (HiByte * &H100&) Or LoByte
    9. End If
    10. Short2Integer = IIf(unsigned = True And Short2Integer < 0, Short2Integer + 65536, Short2Integer)
    11. End Function


    Um es zu verdeutlichen:
    Ich übergebe entweder an die o.g. Function den String "%°" oder besser gesagt
    HiByte=37
    LoByte=176
    Das Ergebnis stimmt mit: 9648

    Ich habe es im Binaryreader so gelöst aber auch das benötigt viel Rechenzeit:

    VB.NET-Quellcode

    1. RecNr = reader.ReadByte * &H100& +
    2. reader.ReadByte


    Ein einfachen Reader.ReadInt16 bringt leider auch nicht das gewünschte Ergebnis.

    Kann mir hier vielleicht jemand helfen?

    Viele Grüße
    pino

    *Verschoben aus Tipps und Tricks Bereich* ~NoFear23m

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

    Hallo,

    vielen Dank für den Link.
    Ich habe es nun so umgesetzt und es funktioniert.Falls es eine elegantere Vorgehensweise gibt, bin ich für jeden Tip dankbar.

    VB.NET-Quellcode

    1. Dim reader As BinaryReader = New BinaryReader(File.Open("datei", FileMode.Open), Encoding.Default)
    2. Dim RecNr = reader.ReadBytes(2)
    3. Array.Reverse(RecNr)
    4. RecNr = BitConverter.ToInt16(RecNr, 0)


    Viele Grüße

    VB.NET-Quellcode

    1. Dim RecNr = reader.ReadBytes(2)
    2. ...
    3. RecNr = BitConverter.ToInt16(RecNr, 0)

    Hey, das funktioniert nicht, RecNr ist Byte() und nicht Short/Int16.

    VB.NET-Quellcode

    1. Dim reader As System.IO.BinaryReader = New System.IO.BinaryReader(System.IO.File.Open("datei", System.IO.FileMode.Open), System.Text.Encoding.Default)
    2. Dim bytes As Byte() = reader.ReadBytes(2)
    3. System.Array.Reverse(bytes)
    4. Dim RecNr As Short = System.BitConverter.ToInt16(bytes, 0)
    "Denken ist die schwerste Arbeit, die es gibt. Das ist wahrscheinlich auch der Grund, warum sich so wenig Leute damit beschäftigen." - Henry Ford
    Hallo,

    prima, vielen Dank. Habe es entsprechend abgeändert und es funktioniert auch soweit.

    Jetz habe ich nur noch eine Frage.

    Ich müsste folgende Bytes im Nachhinein zerlegen können, da sie unterschiedlich genutzt werden

    VB.NET-Quellcode

    1. Dim bytes As Byte() = reader.ReadBytes(40)


    In etwa so....
    Dim Wert1 = Mid(bytes, 1,20)
    oder
    Wert1 = Mid(bytes,10,5)

    Ich sehe nur die Möglichkeit die Startposition anzugeben, nicht aber die Länge.
    Oder habe ich hier einen Denkfehler und die Länge wird immer durch den entsprechenden Wert durch den bitconverter-Typ vorgegeben?

    Viele Grüße
    pino
    @pino Die einfachste Variante ist, dass Du Dir die betreffenden Bytes "rauspickst" und einzeln konvertierst.
    Du kannst Dir natürlich auch eine Struktur basteln, wo Du per Deklaration und Offset einzelner Struktur-Member die Bytes anderen Datentypen zuordnen kannst:
    docs.microsoft.com/en-us/dotne…ute?view=netframework-4.8
    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!