char array mit /0



  • Hallo zusammen.

    Über einen Nachrichtenkanal bekomme ich eine Struktur in der unter anderem ein char[] array drin ist.
    In dem charArray sollte nun ein Name drin stehen. Was bisher immer funktioniert hat. Beim Umstieg auf ein neueres System des Nachrichtenkanals (ODK von Siemens) erhalte ich nun nach jedem Zeichen ein \0

    der Inhalt sieht also wie folgt aus. Beipiel:

    [0] H
    [1]\0
    [2] a
    [3]\0
    [4] l
    [5]\0
    [6] l
    [7]\0
    [8]o
    [9]\0

    wie bekomme ich den String in ein lesbares Format. Muss ich über das ganze Array drüber iterieren und die benötigten Zeichen einzeln raus kopieren?



  • @booster
    Welche Kodierung schickt dein Gegenüber?

    Das ganze könnte nämlich ein 16-Bit Unicodestring sein.



  • Das ist dann ein Unicode-String (Wide-String), d.h. jedes Zeichen wird mit 2 Bytes übertragen.
    Du kannst also dann ein wchar_t-Array dafür benutzen.

    Und zum Umwandeln in ein Multibyte-Char-Array gibt es die Funktion wcstombs.



  • @booster Das kann UTF-16 in Little-Endian (Intel Byte Order) sein
    Da gehört dann noch eine 0x0000 (2 Byte) als Terminator dazu.



  • @Th69

    Ja denke das ist mit Sicherheit eine Unicode Codierung

    @Th69 sagte in char array mit /0:

    Du kannst also dann ein wchar_t-Array dafür benutzen.

    aber ich erhalte die nachricht ja in einem normalen char array.

    muss ich das nun erst mal in ein wchar_t Array kopieren damit ich es nachher mit wcstombs wieder in ein char array wandeln kann?



  • Es kommt darauf an, wie du die Daten weiterverarbeitest, z.B. in eine Datei schreibst oder ausgibst, d.h. welche konkrete Kodierung du dafür benötigst.



  • @Th69
    Ich benötige sie eigentlich nur für einen Vergleich mit einem std::string.



  • Kannst du dann keinen std::wstring verwenden?



  • @Th69

    nein kann ich nicht. Aber auch wenn ich es könnte. Es sollte doch möglich sein den Inhalt des char arrays auch wenn der inhalt davon wchar_t sein sollte in einen normalen std::string zu wandeln.



  • Ich bin mir nicht sicher ob es hilft. Aber folgender round-trip funktioniert bei mir:

    std::string test = "Hallo";
    std::cout << test << '\n';
    std::wstring test2(test.begin(), test.end());
    std::wcout << test2 << '\n';
    std::string test3 = std::string(test2.begin(), test2.end());
    std::cout << test3 << '\n';
    


  • @booster Wenn Dir nix besseres einfällt, kannst Du doch zuerst mal jedes 2. Byte in ein anderes Array schreiben, dann hast Du dort die Nullen weg ...



  • @booster sagte in char array mit /0:

    Ich benötige sie eigentlich nur für einen Vergleich mit einem std::string.

    Dann würde ich dir folgendes empfehlen:
    × Interpretiere deine empfangene Nachricht als Unicode
    × Wandele dein Prüfstring von MBS nach Unicode
    × Vergleiche beide Unicode Strings miteinander

    Das Problem ist einfach: Was soll passieren wenn beispielsweise kyrillische Zeichen empfangen werden? Dann muss nicht unbedingt nach dem ersten empfangenen Byte ein Nullbyte folgen. Wenn du jedes zweite Byte wegwirfst, kann es also passieren dass du ein kyrillisches Zeichen als deutsches Zeichen interpretierst.

    PS:
    Es gibt in UTF 16 ein Zeichen mit der Darstellung 0x0D 0x0A. In ASCII sind das die zwei Zeichen: Carriage Return und Line Feed. In UTF16 das Zeichen für Malayalam Letter Uu.



  • @Quiche-Lorraine sagte in char array mit /0:

    × Interpretiere deine empfangene Nachricht als Unicode

    Wie soll ich das machen? Einfach das char array in ein wchar Array kopieren?



  • Du kannst es als const wchar_t * casten.

    Edit: Hast du denn selber die Struktur dafür angelegt oder benutzt du eine Headerdatei des Anbieters? Evtl. kannst du dort schon per Makro o.ä. den Datentyp ändern.
    Oder ist das ein allgemeiner Byte-Puffer für verschiedene Daten(typen)? Dann mußt du ja sowieso jedesmal passend umwandeln ('casten').



  • @booster sagte in char array mit /0:

    @Quiche-Lorraine sagte in char array mit /0:

    × Interpretiere deine empfangene Nachricht als Unicode

    Wie soll ich das machen? Einfach das char array in ein wchar Array kopieren?

    #include <iostream>
    
    using namespace std;
    
    int main()
    {
    	char ca[] = {'T', 0, 'e', 0, 's', 0, 't', 0, 0};
    	wchar_t *wca = reinterpret_cast<wchar_t*> (ca);
    
    	wcout << wca;
    }
    


  • @Th69

    Ich bekomme den Header des Anbieters.

    Ja ich könnte das umstellen mit dem Macro Unicode. Aber nur wenn das Zeugs von Siemens nicht so buggy wäre.
    Sobald ich das Macro einschalte empfange ich gar keine Nachrichten mehr. Selbst der Support von Siemens konnte mir da bisher keine Erklärung dafür geben.

    Ich denke ich versuche es erst mal mit dem casten.



  • @booster sagte in char array mit /0:

    Ja ich könnte das umstellen mit dem Macro Unicode. Aber nur wenn das Zeugs von Siemens nicht so buggy wäre.
    Sobald ich das Macro einschalte empfange ich gar keine Nachrichten mehr. Selbst der Support von Siemens konnte mir da bisher keine Erklärung dafür geben.

    Kann es sein das du mit einem externen Modul kommunizierst? Also beispielsweise mit einem Siemens-Gerät welches du an einen seriellen Port angeschlossen hast? Und davon die Daten empfängst?



  • @Quiche-Lorraine sagte in char array mit /0:

    Kann es sein das du mit einem externen Modul kommunizierst?

    Nein nur mit einer Software von Siemens keinem externen Gerät. Software nennt sich WinCC.
    Aber ich habe das Problem gelöst.

    Danke euch für eure Hilfe.


Log in to reply