这是一个简单的测试程序,说明了我遇到的问题:
#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;
}
Run Code Online (Sandbox Code Playgroud)
输出:
sizeofUi32: 4
Result: 12 sizeofUi32: 17179869184
Run Code Online (Sandbox Code Playgroud)
我认为这个问题可能是由于std :: copy接受迭代器而不是指针,但是从我在这里得到的东西,
指针是一个迭代器
所以我的示例代码必须有一个简单的问题,我错过了.但我无法发现它.你能解释一下,这里有什么问题吗?
编辑1:
所以从我上心的答案,即反序列化的字节向量,如果我知道正确的顺序和类型在矢量存储的数据,我可以尽量避免使用的std ::复制和公正分配矢量值适当类型的变量.它有效,但它安全吗?
uint32_t a = v[4];
uint8_t b = v[8];
Run Code Online (Sandbox Code Playgroud)
小智 8
当前的问题是:
Run Code Online (Sandbox Code Playgroud)std::copy(&ui32, &ui32 + sizeof ui32, &v[4]); ^^^^^^^^^^^^^
&ui32有类型uint32_t *,并添加任何东西已经考虑到对象的大小.你有效地试图复制sizeof ui32 uint32_t对象,但你只有一个,所以你应该使用+ 1.
除此之外,使用std::copy不同类型的指针可能不会给你你期望的结果.它的作用v[4] = ui32;,它只要作品ui32里面Byte的范围,它是在这里,但是这不是你可以在一般的依靠.
第二个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);
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1167 次 |
| 最近记录: |