char array mit /0



  • 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.


  • Gesperrt

    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.


Anmelden zum Antworten