Ich möchte eine 64-Bit-Elementvariable Byte für Byte in einen Vektor kopieren.Kopiere Member-Variable in Byte-Vektor
Bitte vermeiden Sie mir, Bit-Operation zu verwenden, um jedes Byte zu extrahieren und sie dann in Vektor zu kopieren.
Ich möchte dies durch eine Zeile tun.
Ich benutze memcpy und kopieren Methoden, aber beide fehlgeschlagen. Hier
ist der Beispielcode:
#include <iostream>
#include <vector>
#include <cstdint>
#include <cstring>
using namespace std;
class A {
public:
A()
: eight_bytes_data(0x1234567812345678) {
}
void Test() {
vector<uint8_t> data_out;
data_out.reserve(8);
memcpy(data_out.data(),
&eight_bytes_data,
8);
cerr << "[Test]" << data_out.size() << endl;
}
void Test2() {
vector<uint8_t> data_out;
data_out.reserve(8);
copy(&eight_bytes_data,
(&eight_bytes_data) + 8,
back_inserter(data_out));
cerr << "[Test2]" << data_out.size() << endl;
for (auto value : data_out) {
cerr << hex << value << endl;
}
}
private:
uint64_t eight_bytes_data;
};
int main() {
A a;
a.Test();
a.Test2();
return 0;
}
'std :: vector <> :: reserve' nur Raum zuordnet, es sagt nicht, den Vektor, wie Viele Elemente werden in den Vektor eingefügt. Und da Sie memcpy verwenden, um das eigentliche Kopieren auszuführen, weiß der Vektor nicht, dass die kopierten Bytes jetzt verwendet werden. – evan
Ein Teil des Fehlers im ersten Fall ist Ihr Verständnis davon, wie 'reserve()' funktioniert und wie es den zugrunde liegenden Vektor beeinflusst. Und im zweiten Fall ist Typed-Pointer-Arithmetik entscheidend, um zu verstehen, wo die Räder von dort abfielen. '(& acht_bytes_data) + 8' ist nicht acht Bytes nach der Basisadresse von' acht_bytes_data', seinen acht 'uint64_t' Elementen (und ziemlich tief in das Land von * undefiniertem Verhalten *, da du nur * ein * solches Element hast) . – WhozCraig
@evan Ich verwende 'resize()', um 'reserve()' im ersten Fall zu ersetzen. Es klappt. – Christophe