wchar_t einzelne Bytes ansprechen



  • Hi,

    wie spreche ich einzelne Bytes in einem wchar_t an?

    #include <iostream>
    
    int main(){
        wchar_t wc = L'ab';
        std::cout << (char)wc << '\n';
    }
    

    gibt 'b' aus.
    Durch welche bitweise Operation komm ich nun an das 'a' ran?
    Ich hätte mir sowas wie wc <<= 1 oder wc >>= 1 vorgestellt (die Reihenfolge bringt mich durcheinander). Aber das ist es nicht.

    Was muss ich machen?



  • accesspoint schrieb:

    Hi,

    wie spreche ich einzelne Bytes in einem wchar_t an?

    #include <iostream>
    
    int main(){
        wchar_t wc = L'ab';
        std::cout << (char)wc << '\n';
    }
    

    gibt 'b' aus.
    Durch welche bitweise Operation komm ich nun an das 'a' ran?
    Ich hätte mir sowas wie wc <<= 1 oder wc >>= 1 vorgestellt (die Reihenfolge bringt mich durcheinander). Aber das ist es nicht.

    Was muss ich machen?

    wc>>8, würde ick mal vorschlagen. 😉



  • Andromeda schrieb:

    wc>>8, würde ick mal vorschlagen. 😉

    Ach, stimmt, wir sprechen über Bits, nicht Bytes 😃
    Aber das hat das Problem nicht gelöst, bzw. komme immer noch nicht ans 'a' ran.

    Aber ich glaube, das liegt an der Warnung, die ich bekomm...

    warning: extraneous characters in character constant ignored
        wchar_t wc = L'ab';
                     ^
    


  • Mit anderen Worten: das b ist weg. Und das ist ja auch kein Wunder ' ' ist für EIN Zeichen - das L ändert da nichts dran.



  • Wenn ich das 'L' weglasse klappt es wunderbar. Aber mit Warnung.



  • Ick glaube auch nicht, dass du auf diese weise 2 chars in ein wchar_t quetschen kannst. was hast du überhaupt vor?



  • Andromeda schrieb:

    was hast du überhaupt vor?

    meta_string<'my', ' ', 'awe', 'some', ' ', 'str', 'ing'>::str
    😃



  • accesspoint schrieb:

    Andromeda schrieb:

    was hast du überhaupt vor?

    meta_string<'my', ' ', 'awe', 'some', ' ', 'str', 'ing'>::str
    😃

    Ein Template das Strings zusammenklebt, wenn ich das richtig sehe?
    Das gibt es doch bestimmt schon.



  • Andromeda schrieb:

    Das gibt es doch bestimmt schon.

    In Boost.Mpl gibts das soweit ich weiß.
    Aber ich hab halt Spaß daran ein eigenes meta_string<> zu bauen.



  • accesspoint schrieb:

    Andromeda schrieb:

    Das gibt es doch bestimmt schon.

    In Boost.Mpl gibts das soweit ich weiß.
    Aber ich hab halt Spaß daran ein eigenes meta_string<> zu bauen.

    Dann viel Spaß noch. Ick bin eher so der C-Coder und habe leider keine Ahnung von C++ Templates. 😞



  • Und weshalb willst du das genau haben?



  • Techel schrieb:

    Und weshalb willst du das genau haben?

    Damit ich mir einen runterholen kann.



  • du könntest schreiben char *p = (char*) &wc und dann kannst du mit *p oder p[0] auf das letzte und mit *(p+1) oder p[1] auf das erste byte zugreifen.



  • accesspoint schrieb:

    Techel schrieb:

    Und weshalb willst du das genau haben?

    Damit ich mir einen runterholen kann.

    wer dumm fragt... 😃



  • Meinst du? Ich finde die Frage schon berechtigt, schließlich händelst du da mit höchst compilerspezifischen Sachen herum. Heißt: wchar_t-Literale mit mehreren Zeichen wie bei char gibt's nicht.



  • Ansonsten kannst du für dein Vorhaben strings in templates zu bekommen dir auch mal das anschauen:
    (nur im globalen scope deklarierbar) https://github.com/5cript/mplex/blob/master/string/string.hpp#L108
    (Copy Paste geht nicht, weil das krams aus meiner lib benutzt, die nur dazu da war mir metaprogrammierung beizubringen, sollte sich aber austauschen lassen mit standardmitteln)

    #include "string/string.hpp"
    
    MAKE_STRING(Bla, "String content as literal");
    
    int main()
    {
        mplex::print_single <Bla>(std::cout); // prints type to cout.
        // -> mplex::string <(char)83, (char)116, (char)114, ...>
    }
    

    oder überall:
    https://github.com/5cript/mplex/blob/master/string/inline_string.hpp

    #include "string/inline_string.hpp"
    
    int main()
    {
        mplex::print_single <SHORT_STRING("Hello World!")>(std::cout);
       // -> mplex::string <(char)72, (char)101, ...>
    }
    


  • Techel schrieb:

    Meinst du? Ich finde die Frage schon berechtigt, schließlich händelst du da mit höchst compilerspezifischen Sachen herum. Heißt: wchar_t-Literale mit mehreren Zeichen wie bei char gibt's nicht.

    und weiter?
    wenn ich hier ne frage stelle wie was geht, ist das letzte was ich hören will: "wieso was hast du denn vor?" total dumm, unnötig und absolut unproduktiv. Ich finde er hat die absolut passende antwort gegeben



  • also wenn man andere leute dafür bezahlt, dass diese einem das denken und lernen abnehmen, könnte man sich so etwas heraus nehmen, ansonsten ist so etwas unpraktisch.



  • looooooool schrieb:

    accesspoint schrieb:

    Techel schrieb:

    Und weshalb willst du das genau haben?

    Damit ich mir einen runterholen kann.

    wer dumm fragt... 😃

    rofl 😃 😃 😃



  • looooooool schrieb:

    wenn ich hier ne frage stelle wie was geht, ist das letzte was ich hören will: "wieso was hast du denn vor?"

    Diese Meinung teile ich. Mindestens gehört aber eine ordentliche Antwort auf die Frage dazu, just my 2 cts.


Log in to reply