これは私が直面した問題を説明する簡単なテストプログラムです:
#include <iostream>
#include <stdlib.h>
#include <inttypes.h>
#include <vector>
using namespace std;
typedef unsigned char Byte;
int main( )
{
uint32_t ui32 = 12;
size_t sizeofUi32 = sizeof ui32;
cout << "sizeofUi32: " << sizeofUi32 << endl;
vector<Byte> v(10);
std::copy(&ui32, &ui32 + sizeof ui32, &v[4]);
uint32_t result = 0;
std::copy(&v[4], &v[4] + sizeof ui32, &result);
cout << "Result: " << result << " sizeofUi32: " << sizeofUi32 << endl;
return 0;
}
出力:
sizeofUi32: 4
Result: 12 sizeofUi32: 17179869184
この問題は、ポインタではなくイテレータを受け入れるstd :: copyが原因である可能性があると思いましたが、ここでSOで取得したものからです。
ポインタはイテレータです
したがって、サンプルコードには、欠落している単純な問題があるはずです。しかし、私はそれを見つけることができません。ここで何が問題なのか説明してもらえますか?
編集1:
したがって、回答から、バイトのベクトルを逆シリアル化するために、ベクトルに格納されているデータの正しい順序とタイプがわかっている場合は、std :: copyの使用を避け、適切なタイプの変数にベクトル値を割り当てることができるという考えが得られました。動作しますが、安全ですか?
uint32_t a = v[4];
uint8_t b = v[8];
差し迫った問題はここにあります:
std::copy(&ui32, &ui32 + sizeof ui32, &v[4]); ^^^^^^^^^^^^^
&ui32
タイプがありuint32_t *
、それに何かを追加すると、オブジェクトのサイズがすでに考慮されます。sizeof ui32
uint32_t
オブジェクトを効果的にコピーしようとしていますが、オブジェクトは1つしかないため、を使用する必要があります+ 1
。
それはさておき、std::copy
さまざまなタイプのポインターを使用しても、期待した結果が得られない可能性があります。の効果がありv[4] = ui32;
、ここにあるの範囲ui32
内にある限り機能しByte
ますが、一般的に信頼できるものではありません。
2つ目std::copy
はほぼ同じ問題ですが、方向が逆です。
あなたにできることは:
std::copy((Byte*) &ui32, (Byte*) (&ui32 + 1), &v[4]);
// or std::copy((Byte*) &ui32, (Byte*) &ui32 + sizeof ui32, &v[4]);
...
std::copy(&v[4], &v[4] + sizeof ui32, (Byte*) &result);
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加