Strings anders in VB.net als in VB6?

  • VB.NET
  • .NET (FX) 3.0–3.5

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

    Strings anders in VB.net als in VB6?

    Hallo Zusammen,
    seit neuestem versuche ich mich in VB.net... mit ach und krach bekomm ich das meiste hin so das es wieder funktioniert wie früherin VB6.

    Nun hab ich aber ein Problem an dem ich nicht mehr weiterkomme.

    alter VB6 Code
    ------------------------
    'Datei einlesen
    fk = FreeFile
    Open sFilename For Binary Access Read Shared As #fk
    If Err <> 0 Then dann egal...

    fl = LOF(fk)
    KeyBuffer = String(fl, Chr$(0))
    Get #fk, , KeyBuffer
    Close #fk
    If Err <> 0 Then blabla: Exit Sub

    DecodeFromBuffer KeyBuffer, TxtString

    neuer VB.Net Code
    -----------------------------------
    'Keydatei einlesen
    fk = FreeFile()
    FileOpen(fk, sFilename, OpenMode.Binary, OpenAccess.Read, OpenShare.Shared)
    If Err.Number <> 0 Then blabla : Exit Sub

    fl = LOF(fk)
    KeyBuffer = New String(Chr(0), fl)
    FileGet(fk, KeyBuffer)
    FileClose(fk)
    If Err.Number <> 0 Then blabla : Exit Sub

    DecodeFromBuffer(KeyBuffer, TxtString)

    Hier ist schon ein krasser unterschied in dem was aus der Datei gelesen wird.
    in VB6 hab ich ab der Stelle 127 in diesem String irgendwelche Hyroglyphen ( ™ƒ}Å呬‚UÕLó×6’€ cý6r͒ݱñ\³F],¢ëƒ)
    der ganze String hat eine Länge von 1052

    In VB.Net
    hat der String eine Länge von 1052 aber der String hört ab der 127. Stelle einfach auf :(

    Ich hab schon versucht die einzelnen Bytes in ein String zu lesen aber da hab ich das gleiche ergebnis :(

    Hoffe jemand hat eine Idee

    Grüße
    Tim
    @ Codrix Willkommen im Forum. :thumbup:
    Vielleicht fängst Du an und schmeißt den ollen VB6-Code raus. FreeFile ist nicht mehr erforderlich.
    So was:

    VB.NET-Quellcode

    1. Using fs As New IO.FileStream("Pfad", IO.FileMode.Open)
    2. Dim by = fs.ReadByte()
    3. End Using
    In .NET sind Strings im Gegensatz zu VB6 Unicode. Du musst dem Stream sagen, welches Encoding er verwenden soll, üblicherweise Encoding.Default.
    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!
    vergiss alles was du meinst, in vb6 an programmieren gelernt zu haben. Alles, insbesondere Dateizugriffe gehen völlig anders.
    dieses Buch lesen (hingegen das Galileio-Openbook ist Mist) - die gute alte 2005er Version - das ist der grade Weg, wie du den vb6-Ballast loswirst, und dir vb.net aneignest.
    Hallo RodFromGermany,
    danke.

    Deine Version hatte ich davor auch schon versucht. Ich wollte gleich von vornherein es in "VB.Net" Style machen. Hatte aber das gleiche Ergebnis. Ich hab dann den alten VB6 Code genommen und so gut ich konnte angepasst damit das Ergebnis stimmt, leider ohne Erfolg.

    Das doofe an der Sache ist dass in nachfolgenden Funktionen ein String erwartet wird. Ich hatte schon ein ByteArray und dachte mir sollte kein Problem sein daraus ein String zu machen. Leider scheint es so dass es solche Char's sind die er in dem String nicht anzeigt.
    Das Problem selber taucht dann später auf.
    in der nachfolgenden Funktion "DecodeFromBuffer" wird der vordere Teil des Strings abgeschnitten, wieso auch immer...
    sKeyBuffer = Mid$(sKeyBuffer, 128 + 1) (VB6)

    Egal was ich in VB.net mache hab ich nach dem Abschneiden einen leeren String :(

    Das ganze wird bei uns in der Firma verwendet um die Lizenzdatei auszulesen.

    Als Beispiel:
    in der Funktion "DecodeFromBuffer"
    wird der String gekürtzt

    dann die Version ausgelesen
    CryptVersion = StringAsLong(Mid$(sLicKeyBuffer, 1, 4))
    If CryptVersion <> KEYVERSION1 Then LicErrPos = 1200: Exit Sub
    ....


    Private Function StringAsLong(ByVal sValue As String) As Long
    '4 Byte-String als 32 Bit-Wert
    Dim l As Long
    RtlMoveMemory(l, sValue, 4)
    Return l

    End Function

    Die Funktion meckert mich auch an, aber ist mir schon klar wenn sValue ein leerer String ist.


    Vielleicht ist der String ja nicht leer nur die Entwicklungsumgebung Filtert die Darstellung... aber dann hätte ich mehr erwartet wenn ich den String mit Debug.print ausgebe... In VB6 gibt es dann zwar hin und wieder einen Zeilenumbruch aber ich seh lauter komischer Zeichen... die ich in VB-Net nicht sehe :(


    Hallo ErfinderDesRades,
    werde mir das Buch mal durchlesen.
    Hast Du mir aber auf die schnelle eine Lösungsidee?

    nein, da gibt es keine schnelle Lösung. Du musst vb.net neu und richtig lernen, sonst kannst du es nicht programmieren.

    Ich finde auch deine Problembeschreibung gänzlich undurchsichtig - also was wir nicht leisten können, ist iwelchen vb6-Code so freihand aussm Kopf in vb.net-Code umzuwandeln.

    also was willst du machen?
    Hallo ErfinderDesRades,
    ich wollte nicht das Ihr mir den Code macht :)

    Mich wundert es nur dass ich einen String mit einer Länge von 1052 Zeichen hab, aber die ganzen Sonderzeichen nicht sehe und nicht weiterverarbeiten kann. Die Länge stimmt im Verlgeich zu VB6 überein und der Anfang des Strings auch.

    Diese Hyroglyphen ( ™ƒ}Å呬‚UÕLó×6’€ cý6r͒ݱñ\³F],¢ëƒ...) bekomm ich aber in VB.net garnicht zu sehen.

    Vielleicht ist es nur eine Einstellungssache.

    RodFromGermany schrieb:

    In .NET sind Strings im Gegensatz zu VB6 Unicode. Du musst dem Stream sagen, welches Encoding er verwenden soll, üblicherweise Encoding.Default.


    Könnte es damit schon beantwortet sein?
    Es war einmal ein kleiner Bär... der wollte eine Geschichte hörn... Da erzählte ihm seine Mutti:
    Es war einmal ein kleiner Bär... der wollte eine Geschichte hörn... Da erzählte ihm seine Mutti:
    Es war einmal ein kleiner Bär... der wollte eine Geschichte hörn... Da erzählte ihm seine Mutti:
    ... Nun solltest es selber wissen. :'D
    OK,
    ich versuch es mal anders.


    neues Projekt:
    1 Button
    1 Textfeld (beinhalten den Pfad + Datei)
    1 RichTextBox zum Ausgeben


    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    Dim fStream As New FileStream(TextBox1.Text, FileMode.Open)
    Dim br As New BinaryReader(fStream)
    ' Der Größe des data-Arrays wird die Length-Eigenschaft zugewiesen.
    ' Diese beinhält die Größe des Streams in Bytes. Daher passt das in deinem Fall.
    ' Dann wird noch 1 subtrahiert, da die Zahl in den Klammern den maximalen Index angibt.
    Dim data(fStream.Length - 1) As Byte
    For i As Integer = 0 To fStream.Length - 1
    data(i) = br.ReadByte()
    Next
    br.Close()
    fStream.Close()

    RichTextBox1.Text = ByteArrayToTextString(data)
    End Sub

    Private Shared Function ByteArrayToTextString(ByVal Barr As Byte()) As String
    Dim enc As System.Text.Encoding = System.Text.Encoding.Default
    Return enc.GetString(Barr)
    End Function


    Das ganze macht genau das gleiche wie mein anderes Programm.

    Nämlich , blendet mir die ganzen Sonderzeichen aus die nach der 128. Stelle kommen.

    Alle Komponenten sind ohne Veränderungen auf die Form gelegt. Hab also keine Eigenschaften geändert.


    Der Inhalt von Data()
    Data(125) = Bytewert(32)
    Data(126) = Bytewert(0)
    Data(127) = Bytewert(26)
    Data(128) = Bytewert(1)
    Data(129) = Bytewert(0)
    Data(130) = Bytewert(0)
    Data(131) = Bytewert(0)
    Data(132) = Bytewert(16)
    Data(133) = Bytewert(0)
    Data(134) = Bytewert(0)
    Data(135) = Bytewert(0)
    Data(136) = Bytewert(39)
    Data(137) = Bytewert(252)
    Data(138) = Bytewert(246)
    Data(139) = Bytewert(96)
    Data(140) = Bytewert(139)

    Meine Frage nun...
    Wie kann ich in Vb.Net diese Werte ab Data(126) auch Anzeigen und ggf damit Arbeiten (als String)

    wenn ich mir folgendes ausgebe "RichTextBox1.TextLength"
    hab ich einen Wert von 126.

    Wieso wenn das Dataarray 1032 gross ist?


    Das Problem ist vermutlich, dass du es hier ganz einfach nicht mit einer "Zeichenfolge" zu tun hast, sondern tatsächlich mit einem Byte-Array, also einer Anhäufung von Byte-Werten, die vermutlich das Resultat irgendeiner Verschlüsselung/Codierung sind.

    Bei einem String ist es nunmal so, dass ein Character mit dem Bytecode 0 das Ende der Zeichenfolge markiert. Das ist in C/C++ schon immer so gewesen und in VB6 streng genommen auch, allerdings so richtig nur wenn man mit Win32-Api-Funktionen zu tun hatte.
    Was man VB6 aber "unterjubeln" konnte, waren Zeichenketten, die eben doch Null-Chars enthielten (strText = Chr(0) & Chr(0) & Chr(0) & ...). Und das war wohl hier der Fall und das "rächt" sich nun.

    Was immer in diesem Text stehen sollte: Verabschiede dich von der Annahme, das mit String-Funktionen verarbeiten zu können und lerne um auf Byte-Arrays. Wenn hier String und Byte-Array gemischt ist, musst du eben an der richtigen Stelle splitten.
    Ich würde vorschlagen, das ganze als Byte-Array zu lesen (dann funkt dir auch kein Text-Encoding dazwischen), den ersten Null-Char zu suchen, den Teil bis dahin dann per Encoder in einen String zu überführen und den Rest des Arrays dann zu kappen (z.B. ab Position Textende+1 in ein neues - entsprechend kleineres - Array zu kopieren).

    Oder kurz und knapp als Antwort auf deine Frage:

    Codrix schrieb:

    Wie kann ich in Vb.Net diese Werte ab Data(126) auch Anzeigen und ggf damit Arbeiten (als String)

    Gar nicht. Es IST KEIN String.
    Weltherrschaft erlangen: 1%
    Ist dein Problem erledigt? -> Dann markiere das Thema bitte entsprechend.
    Waren Beiträge dieser Diskussion dabei hilfreich? -> Dann klick dort jeweils auf den Hilfreich-Button.
    Danke.
    Ist das Konzept an dieser Stelle denn so wichtig???

    Sorry aber mal ganz ehrlich.

    ich hab ein DataArray von der Grösse X
    da sind irgendwelche Werte drin 1 bis 255

    diese Werte wollte ich in ein String haben. Ob dieser String überhaupt angezeigt werden kann ist mir sowas von egal.

    Weil ich Faul bin und keine Lust hab etliche Funktionen umzuschreiben weil ich eine schnelle Lösung brauche, behalte ich die Idee mit dem String...
    ist doch Super ich hab ein String und kann mir da Teile rausholen um diese weiterzubearbeiten.

    Aber wo sind diese Werte???

    Das war nur ein kleines Programm um Binär Dateien auszulesen. Hab ich hier aus dem Forum auf die schnelle rausgesucht.
    Nachdem ich die Datei ausgelesen hab kann ich mit dem Inhalt als String nicht mehr weiter arbeiten.

    ---------------------------



    ARBY

    ICH DANKE DIR!

    Genau so eine Antwort hab ich erwartet. :)

    Danke.

    Arby schrieb:

    Bei einem String ist es nunmal so, dass ein Character mit dem Bytecode 0 das Ende der Zeichenfolge markiert.
    In .Net eben genau nicht, stattdessen wird hier die Länge des Strings mitgespeichert. Es wird daher wunderbar funktionieren, ein Bytearray mit 0-Bytes in nen String zu konvertieren.

    Codrix schrieb:

    Ist das Konzept an dieser Stelle denn so wichtig???
    na, offensichtlich!
    Nur dadurch, dass wir deinem Konzept näher gekommen sind, konntest du von Arby eine sinnvolle Antwort erhalten: Es geht nicht.
    Ein Byte-Array ist kein String, und hat auch keinen Sinn, es in einen String umzuwandeln.

    (Übrigens kann man durchaus ein Byte-Array in einen String konvertieren, da gibts sogar mehrere Möglichkeiten)
    Hi,

    kurze Offtopic Antwort zu dem "Warum das Konzept verstehen".
    Es ist hier im Forum oft so, dass jemand von einer anderen Sprache nach VB.NET umsteigt und nichts anderes ist der Umstieg von VB6 zu VB.NET.
    Hier gibt es große Tücken, die darin bestehen, dass man meist durch ein elendiges Gewurstel zu einer (fehleranfälligen und unperformanten) Lösung kommt. Das kann aber nicht der Sinn sein, denn hier im Forum wird irgendwann vielleicht noch wer vor deinem Problem stehen, wird dann irgendwo sehen OH SO GEHTS und kopiert sich das Gewurstel weg.
    Das ist nicht im Sinne des Erfinders (welch unbeabsichtigtes Wortspiel).
    Wenn wir das eigentliche Problem verstehen (und das ist nun beim besten Willen nicht der Unterschied von Strings im Vergleich von VB6 und VB.NET) können wir dir eventuell Lösungen nennen, die einfacher und unter Zuhilfenahme des Frameworks umgesetzt werden. Diese sind in der Regel dann gut dokumentiert, performant und nicht fehleranfällig.

    Du musst von der Idee weg kommen, dass hier im Forum alle wissen was du da tust und welchen Sinn es hat. Mit der ersten Frage kann dir wer ne Anleitung zum U-Boot-bauen geben und denkt für seinen Teilbereich "War doch die richtige Antwort"... Macht doch keinen Sinn und strapaziert nur die Nerven von allen.

    Und wenn du nun nur Werte aus nem ByteArray in einen String konvertieren willst, dann kannst du das doch. Dafür gibt es zich Lösungen. Und hier wird dir, wie auch schon oben genannt, das MSDN denke ich durchaus weiterhelfen. Denn dort sind immer gute und anschauliche Beispiele genannt.
    Es war einmal ein kleiner Bär... der wollte eine Geschichte hörn... Da erzählte ihm seine Mutti:
    Es war einmal ein kleiner Bär... der wollte eine Geschichte hörn... Da erzählte ihm seine Mutti:
    Es war einmal ein kleiner Bär... der wollte eine Geschichte hörn... Da erzählte ihm seine Mutti:
    ... Nun solltest es selber wissen. :'D
    Kurz Offtopic zurück.

    Wenn ich von A nach B auf dem rechten Fuß hoppeln will, weil ich das früher immer so gemacht habe oder weil mir das mein Vorgänger so gesagt hat, dann mach ich das erstmal so weiter. Wenn ich plötzlich beim hoppeln Richtung C komme merk ich das was nicht stimmt.
    Wenn ich dann die Frage in ein Forum stelle erwarte ich zwar gegenfragen aber keine Fragen wieso ich das mache und was ich bei B will D ist viel schöner.

    ich hab wegen diesem Problem schon zwei Tage im Internet verbracht und alles Mögliche ausprobiert, was ich in Foren oder auf der MS Seite gefunden hab.

    Je ungenauer man sich ausdrückt umso mehr gegenfragen kommen.
    Ich weiss nicht wie welcher meiner Beiträge dazu geführt hat das Arby mir eine gute Antwort geben konnte, aber das war eine Antwort mit Aussage.

    Geht nicht. Fertig!

    Solche Kommentare wie von ErfinderDesRades (auch wenn er ein Moderator hier drin ist)

    ErfinderDesRades schrieb:

    wahrscheinlich nicht. folgende Problemfelder (Liste unvollständig)
    • vb6-DateiZugriff
    • irgendwas mit Crypt - unklar was das werden soll
    • RTLMoveMemory-API - auch unklar wozu
    • insgesamt kein Konzept erkennbar, was die ganze Sache ühaupt jemals werden soll



    Irgendwas mit Crypt???
    CryptVersion = StringAsLong(Mid$(sLicKeyBuffer, 1, 4))

    Oh bekommt ein Wert zurüch von einer Funktion Namens "StringAsLONG(blabla)". Könnte es denn Möglich sein dass diese Funktion vielleicht einen Long Wert zurück gibt ???? sehr wahrscheinlich... Das diese Variable gerade Crypt heisst... naja da war mein Vorgänger halt kreativ.


    VB6 Dateizugriff...
    Mein zweiter Beitrag.

    bla balbla...

    Also wenn man nicht helfen kann dann sollte man auch keine Kommentare da lassen die einem nix bringen. Gibts hier ne Rangliste wer die meisten Beiträge hat?

    Da bekomm ich echt nen Hals, aber das geht nur gegen eine Person hier.

    Auf alle Fälle Danke Arby.

    Codrix schrieb:

    Solche Kommentare wie von @ErfinderDesRades
    solltest Du lesen und zumindest versuchen zu verstehen, denn wenn jemand so aktiv ist wie er hat er einen gewichtigen Grund, solch zu posten.
    Falls Du Dir im Unklaren über einen Beitrag eines Mitgliedes hier bist, verwende die Suchfunktion und lass Dir alle Beiträge von ihm auflisten, um Dir einen Überblick über die Qualität seiner Beiträge zu verschaffen.
    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!