I einen integralen Typen eines Byte-Array, wie das hier schreibt:Extrahieren
unsigned char Data[10]; // Example byte array
signed long long Integer = 1283318; // arbitrary value
for (int i = 0; i < NumBytes; ++i)
Data[i] = (Integer >> (i * 8)) & 0xff; // Set the byte
In diesem Zusammenhang NumBytes ist die Anzahl des Bytes, die tatsächlich in das Array geschrieben werden, die ich ändern kann, - manchmal werde ich eine kurze, manchmal eine int schreiben, etc. sein
In einem Testfall, wo ich weiß, NumBytes == 2, das den Integralwert abzurufen funktioniert:
signed short Integer = (Data[0] << 0) | (Data[1] << 8);
auf dieser Basis , ICH versucht, das gleiche mit einem langen lange zu tun, es wäre für einen beliebigen ganzzahligen Typen so funktionieren:
signed long long Integer = 0;
for (int i = 0; i < NumBytes; ++i)
Integer |= static_cast<signed long long>(Data[i]) << (i * 8);
Aber dies fehlschlägt, wenn Integer < 0. ich dankbar sein würde, wenn jemand zeigen könnte, was ich bin fehlt hier. Unterbreche ich das Vorzeichen? Wie würde ich sicherstellen, dass dies auf eine tragbare Weise enthalten ist?
Prost!
Geben Sie einen speziellen Fall an, in dem es fehlschlägt (dh der Wert von 'NumBytes', der Inhalt von' Data [0 ... NumBytes-1] ', der Wert von' Integer', den Sie tatsächlich erhalten haben und den gewünschten Wert.) –
Warum nicht stattdessen memcpy verwenden? –
Scheint, mit negativen Werten gut zu funktionieren: https://ideone.com/ABvMM8 Können Sie Spezifizierungen auf Compiler/System geben? – mnistic