String Character ASCII nach ANSI Konvertierung

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

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

    String Character ASCII nach ANSI Konvertierung

    Neu

    Ich nutze die FTDI FT2XX_NET.dll um Daten via USB aus einem angeschlossenen Gerät zu lesen.
    Dabei gibt es mehrere Möglichkeiten die Daten aus dem Empfangspuffer zu holen.

    FTDI.Read(byte[] dataBuffer, UInt32 numBytesToRead, ref UInt32 numBytesRead)

    bzw.

    FTDI. Read(out string dataBuffer, UInt32 numBytesToRead, ref UInt32 numBytesRead)

    I.d.R. nutze ich einen String als dataBuffer, da die Daten als ASCII Zeichen vorliegen.
    Über die empfangenen Daten bilde ich zeichenweise eine simple XOR Prüfsumme

    VB.NET-Quellcode

    1. Dim _iChecksum As Integer = 0
    2. For Each _Char In dataBuffer
    3. _iChecksum =_iChecksum Xor Convert.ToUInt32(_Char)
    4. Next
    5. Return _iChecksum.ToString("X2")


    Es gibt einen einzigen Fall, in dem ich die Daten nicht als ASCII, sondern (mutmaßlich, zumindest behauptet das Notepad++) als ANSI bekomme. Es handelt sich dabei um eine komprimierte Textdatei. Diese wird nicht entpackt sondern so wie sie ist die Prüfsumme darüber gebildet. Hierbei schlägt jetzt meine Prüfsummenbildung fehl, weil für Zeichen mit einem gesetzten MSB keine Entsprechung im ASCII String möglich ist. Es kommt zu keiner Fehlermeldung, aber die Prüfsumme ist am Ende falsch, weil z.B. 0x8B als 0x3F interpretiert wird.

    Daher nutze ich an dieser Stelle den byte[] dataBuffer und

    VB.NET-Quellcode

    1. Dim _btIntChecksum As Byte = 0
    2. For _i As Integer = 0 To dataBuffer.Length
    3. _btChecksum = _btChecksum Xor dataBuffer(_i)
    4. Next
    5. Return Convert.ToString(_btIntChecksum, 16)).ToUpper


    zur Prüfsummenbildung.

    Das ist nicht so schick, weil ich die beiden Möglichkeiten unterscheiden muss.
    Gibt es denn nicht eine Möglichkeit auf das Auslesen der empfangene Daten als byte[] Array zu verzichten und die einzelnen Zeichen des String so umzuwandeln, dass sie nicht als ASCII (max. 07F) sondern als Zeichen bis 0xFF zu verstehen sind?

    Neu

    Was Encodings angeht, vielleicht sind hier schon nützliche Dinge dabei.
    Probleme mit ANSI

    Kann es sein, dass die Variablen nicht richtig benamt sind (btIntCheckSum btCheckSum) in Snippet2?
    Vielleicht hast du ein paar Beispiel-Werte zum Lesen für uns? Also ein Wert, der dir keine Probleme macht und einer, der dir Probleme macht.

    Neu

    @roepke Bytes kannst Du so in einen String konvertieren:

    C#-Quellcode

    1. // = "keys.key";
    2. byte[] letters = new byte[] { 0x6B, 0x65, 0x79, 0x73, 0x2E, 0x6B, 0x65, 0x79 };
    3. string name = System.Text.Encoding.Default.GetString(letters);
    Verwende dabei Dein spezielles Encoding.
    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!

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