使用std :: vector作为数据缓冲区

时间:2015-12-10 13:56:30

标签: c++ vector stl

我正在尝试使用std :: vector作为memmory缓冲区:

int main( )
{
    int i = 0x01020304;
    size_t size = sizeof(int);
    std::vector<char> data;

    data.insert( data.end(), (char*)&i,  (char*)(&i  + size) );

    for ( int i = 0; i < data.size(); ++i){
        std::cout << int(data[i]) << std::endl;
    }

    return 0;
}

我期待输出 4 3 2 1

但我得到了

4
3
2
1
51
73
-107
81
-9
127
0
0
36
-7
84
-50

有人可以解释我做错了吗?

3 个答案:

答案 0 :(得分:2)

只是为了添加其他问题,当你避免代码重复并使其更具可读性时,你也可以避免一些错误:

int i = 0x01020304;
std::vector<char> data;
char *begin = reinterpret_cast<char *>( &i );

data.insert( data.end(), begin,  begin + sizeof(i) ) );

你可能需要使用不同的类型:

template<typename T>
void insertData( std::vector<char> &data, T value )
{
    char *begin = reinterpret_cast<char *>( &value );
    data.insert( data.end(), begin,  begin + sizeof(value) ) );
}

答案 1 :(得分:1)

使用(char*)(&i + size)增加指向int的指针,而不是指向char的指针。由于size似乎是4,因此您发现自己添加了4整数而不是4字符的数据。

auto cp = reinterpret_cast<char*>(&i);
data.insert( data.end(), cp,  cp  + size );

答案 2 :(得分:1)

大小以字节为单位,因此您需要增加char *,而不是int *。

data.insert( data.end(), (char*)&i,  (char*)(&i)+size );