Übersetzen von VB6 zu .NET Code - Benutzung von Funktionen

  • VB.NET

Es gibt 28 Antworten in diesem Thema. Der letzte Beitrag () ist von kafffee.

    kafffee schrieb:

    Also wie kommst du denn auf diese "Magic Bytes"? Im Internet steht ja viel wenn der Tag lang ist.
    Gugge in post#5 die Links, die RFG gegeben hat.
    Wikipedia ist zwar keine autorisierte Referenz-Bibliothek, aber die Leuts, die die Artikel schreiben sind zumindest keine Idioten. (Anderswo im Inet sieht das anders aus)

    kafffee schrieb:

    Also wie kommst du denn auf diese "Magic Bytes"?
    Allgemeinbildung, Programmiererfahrung: en.wikipedia.org/wiki/List_of_file_signatures

    kafffee schrieb:

    Also kann das ja gar nicht bei Null anfangen oder?
    .NET ist 0-basieret, alle Arrays, Listen und solch beginnen mit dem Index 0.
    Die alten Basic-Dialekte waren da anders, VisualBasic kann das noch (rudimentär), deswegen steht da in VB.NET bei der Dimensionierung immer ein - 1 bei der Anzahl.
    Lies die Header-Länge an Bytes in ein Byte-Array ein und konvertiere die einzelnen Positionen zu den Datentypen, die sie repräsentieren.
    Sieh Dir dazu die Klasse BitConverter an:
    docs.microsoft.com/de-de/dotne…bitconverter?view=net-5.0
    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!
    Dass in VB.NET die Arrays bei 0 anfangen war mir bekannt, dass sie das in VB6 nicht tun, hab ich vermutet, man sieht das ja im ursprünglichen Code.

    Kann ich trotzdem das machen:

    VB.NET-Quellcode

    1. bnr(1) = 1
    2. bnr(2) = 2


    und bnr(0) bleibt dann einfach leer? Oder führt das zu einem Fehler?

    Denn wenn ich die Funktion teste, kommt es in Post #17 Zeile 17 zu folgendem Fehler:

    "Die bnr-Variable wird verwendet, bevor ihr ein Wert zugewiesen wird. Zur Laufzeit kann eine Nullverweisausnahme auftreten."

    Versteh ich nicht. Genau in dieser Zeile tu ich ihr doch einen Wert zuweisen...

    kafffee schrieb:

    Oder führt das zu einem Fehler?
    Das hängt vom Folgecode ab, da musst Du jede relevante Zeile explizit prüfen.
    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!
    Schon klar dass ich dann bnr(0) nicht abfragen kann. Meines Erachtens tu ich das auch nicht.

    Wenn ich das Programm dann trotzdem ausführe, kommt es tatsächlich dann zum Laufzeitfehler:

    System.NullReferenceException: "Object reference not set to an instance of an object."
    "bnr" war "Nothing".

    Kapier ich nicht, ich hab ihr doch so:

    VB.NET-Quellcode

    1. bnr(1) = baits(10)

    einen Wert zugewiesen oder?

    kafffee schrieb:

    "bnr" war "Nothing".
    Da bnr ein Array ist, musst Du es zunächst instanziieren, also dimensionieren, hab ich Dir in Post #10 schon mal gezeigt:

    VB.NET-Quellcode

    1. Dim bnr() As Byte = New Byte(DEINE_GRÖßE_HALT) {}
    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!
    Habs grad gleichzeitig auch rausgefunden, allerdings hab ich das so gemacht:

    VB.NET-Quellcode

    1. Dim bnr(4) As Byte


    Wo liegt der Unterschied?

    D.h. die Grösse eines Arrays muss vorher festgelegt werden kann nicht während der Laufzeit verändert werden?

    Die Funktion spuckt mir jetzt tatsächlich was brauchbares aus: 1815368704

    Aber ich bin da etwas skeptisch. Mal angenommen das ist die Tag-Grösse in Bits. Durch acht ergeben sich dann 226921088 Bytes. Geteilt durch 1.000.000 ergeben sich dann 227 MB.
    Das kann ja nicht sein. Ich denke ich hab vielleicht die falschen Bytes ausgelesen oder irgendwas mit dem Typ stimmt nicht. Im Ursprungsquelltext wollte ie Funktion ja eigentlich eine Long zurückgeben.

    In der Dokumentation steht das ja wie oben erwähnt so drin:

    ID3v2 size: 4 * %0xxxxxxx

    Soll das eine Hexadezimalzahl sein, ich bin nicht so das Mathegenie...?

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „kafffee“ ()

    kafffee schrieb:

    Das kann ja nicht sein
    Dann musst Du ein wenig mit dem Offset (Seek) spielen.
    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!
    So nach dem das alles keine Früchte getragen hat, hab ichs mal mit einer Library versucht. UltraID3Lib.dll heisst das gute Stück und ist frei im Internet zu haben, wenn man ein bisschen sucht. Einen Link kann ich leider nicht posten, da mir der Browser den irgendwie nicht kopieren will.
    Trotzdem vielen Dank an alle die mitgewirkt haben, ich hab ja auch was gelernt dabei (>>Binäre Dateien in Byte Arrays einlesen)
    Vielleicht les ich mich da in ner ruhigen Stunde nochmal rein und wag mich so aus Neugierde nochmal ran