hexidezimaler Wert 0x1D, ist ein ungültiges Zeichen Problem

  • VB.NET

Es gibt 19 Antworten in diesem Thema. Der letzte Beitrag () ist von exc-jdbi.

    hexidezimaler Wert 0x1D, ist ein ungültiges Zeichen Problem

    Hallo habe mal wider ein Problem,

    Ich habe einen String in dem es vorkommen kann das ein Hexadezimal Zeichen vorhanden ist, da das aber zum absturz fürt muss es raus.Jetzt weiß ich nur nicht wie ich dieses aus dem String bekomme.


    Danke im Vorraus

    schweichertf schrieb:

    0x1D
    ist C#.
    In VB musst Du im Quelltext &H1D schreiben.
    Zur Konvertieren von Hex nach Dez dürfen diese Suffixe nicht da sein.
    Ansonsten poste mal den kompletten 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!
    mhh ,
    da ich den absturz bei allen Hexadezimal werten bekomme und ich nicht sagen kann was ich alles aus den Netz erhalte währe mir eine Entfernung aller am liebsten.An .Replace hatte ich als erstes auch schon gedacht nur wird mir unter msgBox kein Zeichen angezeigt und nach längerem überlegen wurde mir klar das ich alle entfernen muss.

    Rod From Germany -> Sorry war nur die Fehlermeldung des Debuggers

    Im Anhang habe ich die Datei Hochgeladen.Wobei ich gerne alle Hex Zeichen löschen würde.Vermute mal ich muss alle Zeichen im String auf Hex Prüfen und dann löschen.
    Dateien

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

    Da hättest Du auch den Inhalt gleich posten können. Allerdings ist das ne reine Textdatei. => Was für Hex-Zeichen?
    Hier mal für alle der Inhalt:

    Quellcode

    1. 00:00:00~Geier Sturzflug - Pure Lust am Leben
    2. 00:03:36~Bangles - Manic Monday
    3. 00:06:51~John Davis - Who Do You Love
    4. 00:11:20~Jeanette - No More Tears
    5. 00:15:07~Alexander feat. Sabrina Weckerlin - All (I Ever Want)
    6. 00:18:34~Spice Girls - Who Do You Think You Are
    7. 00:22:30~M People - Open Your Heart
    8. 00:26:19~Lara Fabian - I Will Love Again
    9. 00:30:17~OMD - Dreaming
    10. 00:34:25~Robert Howard & Kym Mazelle - Wait
    11. 00:37:45~Overground - Der letzte Stern
    12. 00:41:30~Enrique - Escape
    13. 00:45:10~Midnight Star - Operator
    14. 00:50:03~Erasure - Blue Savannah
    15. 00:54:33~Captain Jack - Together And Forever!
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.

    schweichertf schrieb:

    Fehlermeldung des Debuggers
    bei welcher Codezeile?
    Sieh Dir mal das hier an:

    VB.NET-Quellcode

    1. Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    2. For Each line In IO.File.ReadLines("F:\Happydays mit Ted und Felix - Ausgabe 775-1 (Titelupdate).txt")
    3. Dim parts() = line.Split(New Char() {Convert.ToChar(&H1D), Convert.ToChar(&H7E)}, System.StringSplitOptions.RemoveEmptyEntries)
    4. Me.ListBox1.Items.Add(parts(0) & " " & parts(1))
    5. Next
    6. End Sub
    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!
    Danke RoadFromGermany.

    Ich habe das ganze mit .Replace(convert.toChar(&H1D)," ") raus gefiltert.Meine Befürchtung ist das ich noch mehr solche Hex daten bekomme und jedesmal die Routine abschmiert.Sollte es also eine komplette möglichkeit geben die Zeichen zu eleminieren währe ich glücklich.Währe aber warscheinlich auch zu Einfach. Zum Speichern benutze ich folgende Routine:

    <
    .WriteStartElement("Title")
    .WriteString(String2)
    .WriteEndElement()

    .WriteStartElement("Artist")
    .WriteString(String1)
    .WriteEndElement()
    .WriteString("")
    .WriteEndElement()
    >

    mhh :( irgendwie bekomme ich das mit dem Quellcode nicht gebacken.

    schweichertf schrieb:

    WriteStartElement()
    Schreibst Du eine XML-Datei?
    Dann lies es auch wie eine XML-Datei!
    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!
    Also Ja ich schreibe eie xml Datei.Das Projekt ist aber umfangreicher.Ich lese daten aus einer txt Datei ein und wandle sie in zwei verschiedene Formate um. Einmal eine Cue und einmal eine mmd. Somit können andere Programme sie weiter verarbeiten.Dabei ist mir allerdings aufgefallen das hex nicht funktioniert beim schreiben einer xml Datei.Was auch zum absturz führt.Da ich selbst die txt Dateien bekomme und ich nie ausschließen kann das sowas dabei ist wollte ich diese eleminieren.

    schweichertf schrieb:

    Dabei ist mir allerdings aufgefallen das hex nicht funktioniert beim schreiben einer xml Datei.


    Natürlich funktionieren "Hex-Werte" (tatsächlich sind das, was du hier meinst, Steuerzeichen) in XML-Daten. Man muss nur die richtigen Werkzeuge benutzen oder - wenn man alles selbst machen will - dann aber auch wissen, wie solche Steuerzeichen korrekt im XML dargestellt werden.
    Aber wie ich dein Projekt verstehe, willst du die ja sowieso loswerden (nicht, weil sie im XML stören, sondern weil sie eigentlich nur aus formatierungsgründen in der Textdatei enthalten sind und keinen Gehalt für deine Nutzung der Daten haben).

    Ich verstehe darum nicht, warum du nicht einfach ein Replace ausführst, um Convert.ToChar(&H1D) durch "" zu ersetzen, bevor du anfängst die gelesenen Zeilen zu splitten und weiter zu verarbeiten.
    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.

    schweichertf schrieb:

    Also Ja ich schreibe eie xml Datei
    Dann schreibe deine Daten intern in eine Klasse und serialisiere diese als XML.
    Dann wird nämlich aus deinem ​&H1D das XML-Pendant ​&#x1D; in die XML geschrieben.

    Abgesehen von der Tatsache, dass der Serialisierer auf jeden Fall eine gültige XML schreibt, hat das den Vorteil, dass du die Daten in einer vernünftigen Datenstruktur wesentlich besser verarbeiten kannst.
    --
    If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
    --
    Bevor überhaupt eine XML-Serialisierung oder dergleichen möglich ist, müssen die HexWerte raus. Und da liegt der störende Pfeffer.
    Ist bekannt welche Hex-Werte vorkommen, so können die problemlos rausgelöscht werden mit Replace.

    Sind die Hex-Werte unterschiedlich, und nicht voraussehbar, dann bleibt dir wohl nicht weiteres übrig als diesen String nach einen Hex-Wertbereich zu durchsuchen, und all jede die Hex-Werte sind rauszulöschen.

    Dazu würde ich ich so vor gehen.
    • Finde den höchsten Hex-Wert heraus z.B. &HFF.
    • Bilde eine Goup mit deinem String oder Splitte ihn
    • Iterriere durch diese StringGroup und finde mit ToUpper alle Hexwerte
    • Lösche die gleich komplettaus der Array, das könnte so ungefähr aussehen
    • >> str = str.Where(Function(itm, idx) Not (idx = j)).ToArray
    • und setzt den String am Schluss wieder komplett zusammen String.Join(" ", str)

    Freundliche Grüsse

    exc-jdbi

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „exc-jdbi“ ()

    exc-jdbi schrieb:

    Bevor überhaupt eine XML-Serialisierung oder dergleichen möglich ist, müssen die HexWerte raus
    Quatsch.
    Ich habe es eben extra probiert und habe eine 1D in einem String deserialisiert.
    MyString = "TEST" & Chr(&X1D) & "TEST"
    ergibt serialisiert in der XML
    <MyString>TEST&#x1D;TEST</MyString>
    Und deserialisieren lässt es sich auch.
    --
    If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
    --
    Das ist mir schon klar.

    Wie ich den TE aber verstehe, will er die nicht drin haben.
    Und soviel es mir recht ist, gibt es wirklich Zeichen die nicht funktionieren je nachdem wie man es macht.
    Solang man auf der Stringseite bleibt, könnte es klappen.

    Es gibt jetzt zwei Möglicheiten.
    Man kann den String vorher säubern, was ich dringend empfehle. So ist die XML auch wohlgeformt.
    oder man säubern nachher und hofft das es irgendwie funktioniert.

    Freundliche Grüsse

    exc-jdbi
    Ja exc-jdbi ,
    Dein Ansatz ist der den ich im Kopf habe.Wobei sich mir eine frage stellt wie ich einen String nach Hexadezimal durchsuchen kann.

    Petaod
    leider muss ich diesem dir widersprechen.Vielleicht gibts es Hexa zahlen die vielleicht gehen aber einige führen zum absturz.Das kann ich anhand meiner Txt Datei nachvollziehen und mein Hauptprogramm hatte deswegen auch schon zwei abstürze die ich allerdings nicht so einfach nachvollziehen konnte.Jetzt aber schon und deswegen würde ich gern alle diese Zeichen raushaben wollen.

    exc-jdbi schrieb:

    Wie ich den TE aber verstehe, will er die nicht drin haben.
    Ich denke mal, dass die wegen falscher Serialisierung drinne sind.
    @schweichertf Gugst Du hier: Konfigurationsdatei in C# erstellen?
    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. Module Module1
    2. Sub Main()
    3. Dim text As String = "00:00:00~Geier Sturzflug - Pure Lust am Leben" ' Das Zeichen Hex 1D befindet sich zwischen Tilde und G
    4. 'Evtl. den String aus deiner Textdatei neu einfügen, falls das Zeichen durch das kopieren verloren geht.
    5. 'In der Vorschau ist es noch enthalten.
    6. 'Nach dem Absenden allerdings nicht mehr.
    7. 'Also neu einfügen oder den String "00:00:00~" & Chr(29) & "Geier Sturzflug - Pure Lust am Leben" verwenden
    8. If text.Contains(Chr(29)) Then
    9. Debug.Print("Zeichen 1D hex an position: " & text.IndexOf(Chr(29), 0) + 1.ToString)
    10. Else
    11. Debug.Print("Nicht vorhanden")
    12. End If
    13. text = text.Replace(Chr(29), "") '<--- Zeichen Hex 1D (Dez 29) entfernen
    14. Debug.Print("")
    15. Debug.Print("Nach Replace: ")
    16. If text.Contains(Chr(29)) Then
    17. Debug.Print("Zeichen 1D hex an position: " & text.IndexOf(Chr(29), 0) + 1.ToString)
    18. Else
    19. Debug.Print("Nicht vorhanden")
    20. End If
    21. End Sub
    22. End Module


    Wenn du alle Steuerzeichen entfernen willst: (Ist wahrscheinlich unnötig)

    VB.NET-Quellcode

    1. For i As Integer = 0 To 31
    2. Select Case i
    3. Case 9, 10, 13 'Tab, Lf, Cr nicht entfernen z. B.
    4. Case Else
    5. text = text.Replace(Chr(i), "")
    6. End Select
    7. Next
    RFG hat es sicher auf den Punkt gebracht. Diese Vermutung habe ich nähmlich auch. Sobald man den falschen Stream oder Reader was halt an Werkzeug zur Verfügung steht und die nicht dem entsprechen, mit dem es ursprüglich gemacht wurde, so kann genau das passieren.

    Meine Überlegung oben bezog sich darauf jene Hex-Werte oder eben Zeichen die nicht zum ursprüglichen Text dazugehören herauszulöschen. Daher auch der Hexwertebereich von 0 - 255 (was unter Umständen nicht einmal alles abdeckt). Aber meistens darf man annehmen, dass in einem deutschen Text alle Literale die nicht direkt mit der deutschen Textgebung (ausser vbCrLF) zu tun haben, dass die nicht hineingehören.

    Freundliche Grüsse

    exc-jdbi