这是一个简单的测试程序,说明了我遇到的问题:
#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;
}
output:
sizeofUi32: 4
Result: 12 sizeofUi32: 17179869184
我认为这个问题可能是由于 std::copy 接受迭代器而不是指针造成的,但是从我得到的结果来看here https://stackoverflow.com/questions/2728190/how-are-iterators-and-pointers-related,
指针是迭代器
因此,我的示例代码一定存在一个我遗漏的简单问题。但我看不出来。
您能解释一下,这里出了什么问题吗?
EDIT 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
.
除此之外,使用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);
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)