beliebige std::vector<> in std::vector<unsigned char> wandeln



  • Hallo zusammen.

    Ich habe diverse std::vector<>, die native Datentypen (z.B. int) beinhalten. wie kann ich diese am besten in einem std::vector<unsigned char> umwandeln?

    das ist meine aktuelle Lösung:

    // Testvektor
    std::vector<unsigned short> vector1;
    vector1.push_back(1);		// = 0x0001
    vector1.push_back(4660);	// = 0x1234
    vector1.push_back(0x66CC);
    
    // Ausgabevektor
    std::vector<unsigned char> vector2;
    for (auto const& item : vector1)
    {
    	std::vector<unsigned char> tmp;
    	tmp.resize(2);
    	tmp.at(0) |= (item >> 8) & 0xFF;
    	tmp.at(1) |= item & 0xFF;
    
    	vector2.insert(vector2.end(), tmp.begin(), tmp.end());
    }
    
    // --> Inhalt (vector2): 0x00 0x01 0x12 0x34 0x66 0xCC
    

    ...nun das funktioniert, wirkt aber ...nunja... umständlich. Geht das besser?

    viele Grüße,
    SBond



  • // Testvektor
    std::vector<unsigned short> vector1( { 0x0001, 0x1234, 0x66CC } );
    
    // Ausgabevektor
    std::vector<unsigned char> vector2;
    vector2.reserve(vector1.size() * 2);
    
    for (auto const& item : vector1)
    {
        vector2.emplace_back(item >> 8);
        vector2.emplace_back(item);
    }
    
    // --> Inhalt (vector2): 0x00 0x01 0x12 0x34 0x66 0xCC
    

    Gibt vielleicht auch schönere Lösungen, aber da sind zumindest schon ein paar Verbesserungen drinnen.



  • danke 🙂

    ja, ist schon etwas kürzer 😉


  • Mod

    Müssen diese Objekte denn tatsächlich big-endian gespeichert werden? Sonst böte sich natürlich eine reine Kopie an:

    std::vector<unsigned char> vector2(vector1.size() * sizeof(vector1[0]));
    std::memcpy(vector2.data(), vector1.data(), vector2.size());
    


  • Nur aus Interesse: verwenden denn inzwischen wirklich alle Systeme einheitlich Little-Endian?
    Also auch z.B. ARM, etc.?



  • himmela schrieb:

    Nur aus Interesse: verwenden denn inzwischen wirklich alle Systeme einheitlich Little-Endian?

    Nö, gibt noch genug Big-Endian.
    PowerPC und SPARC sind klassische Big-Endian CPUs. Mittlerweile umschaltbar, werden aber meistens noch mit Big-Endian betrieben.
    s390 und seine ganzen Nachfolger sind rein Big-Endian.

    himmela schrieb:

    Also auch z.B. ARM, etc.?

    ARM ist umschaltbar, Default ist aber (und war schon immer) Little-Endian. Komisch dass du also gerade wegen ARM fragst.



  • Da ich nach Möglichkeit immer möglichst plattformunabhängigen Code schreiben will, hätte es mich nur interessiert. Wenn bei jedem Prozessor dann nämlich die Ergebnisse anders ausfallen, kann man die Daten ja nicht ordentlich weiterverarbeiten. 😉
    Nach ARM habe ich gefragt, weil ich keine Ahnung davon habe und es nach x86_64 mehr oder weniger die bekannteste Plattform ist.
    Aber danke!



  • Ich dachte immer BigEndian ist mehr vertreten als LittleEndian. Bisher hatte ich auch nur ein einziges mal mit LittelEndian zu tun. Bei Internetprotokollen wird in der Regel auch von 'Network Byte Order' gesprochen, was dem BigEndian entspricht.

    Habt ihr vermehrt mit LittleEndian zu tun? Würde mich einfach mal interessieren.

    ..und frohe Weihnachten 😉



  • @SBond
    x86 ist rein Little-Endian. ARM ist auch üblicherweise Little-Endian. Das wären dann schon zwei sehr wichtige Plattformen. Bei Datenformaten findet man beides, üblicherweise je nachdem auf welcher Plattform das Format erfunden wurde.



  • stimmt. Du hat Recht. Ich hatte da einen Denkfehler.


Anmelden zum Antworten