如何获取std::vector<int>*的值?

How to get the values of a std::vector<int>*?

我不知道在 'Title' 框中放什么,所以我认为标题没有完全回答我的问题,我很抱歉。

首先,我想介绍一下背景。我发现网络开发两周了现在为了一个3D游戏。

今天我专注于使用 std::vector 发送包裹作为 .obj 发送模板,但这不是我的问题。

问题是我没有收到来自这个向量的信息。

一图抵千言,下面是我的代码(这段代码只是为了测试'server'端char[]数据的加密和接收客户端)。

我的 C++ 程序:

#include <vector>
#include <iostream>

int main()
{
    /* -- server -- */
    // variables to buffer
    std::vector<int> vec = { 1, 25, 156, 0, 1 };
    short type = 25;
    int written = 0;
    char buffer[256] = {};

    memcpy(&buffer[written], &type, sizeof(type));
    written += sizeof(type);

    memcpy(&buffer[written], &vec, sizeof(vec));
    written += sizeof(vec);

    std::cout << "/* -- Server -- */\n" << std::endl;
    std::cout << "[written] --> " << "Size : " << sizeof(written) << " | Value : " << written << std::endl;
    std::cout << "[type] --> " << "Size : " << sizeof(type) << " | Value : " << type << std::endl;
    std::cout << "[vec] --> " << "Size : " << sizeof(vec) << " | Value : " << vec.data() << std::endl;

    // 'send' to client && 'receive' from server \ (for example)
    char buffer2[256] = {};
    memcpy(&buffer2, &buffer[0], sizeof(buffer2));

    /* -- client -- */
    // buffer to variables
    std::vector<int>* vec2;
    short type2 = 0;
    int read = 0;
    
    memcpy(&type2, &buffer[read], sizeof(type2));
    read += sizeof(type2);

    memcpy(&vec2, &buffer[read], sizeof(vec2));
    read += sizeof(vec2);

    std::cout << "\n\n";
    std::cout << "/* -- Client -- */\n" << std::endl;
    std::cout << "[read] --> " << "Size : " << sizeof(read) << " | Value : " << read << std::endl;
    std::cout << "[type2] --> " << "Size : " << sizeof(type2) << " | Value : " << type2 << std::endl;
    std::cout << "[vec2] --> " << "Size : " << sizeof(vec2) << " | Value : " << vec2->data() << std::endl;


    std::cout << "\n"; system("pause");
    return 0;
}

Return 命令的:

/* -- Server -- */

[written] --> Size : 4 | Value : 18
[type] --> Size : 2 | Value : 25
[vec] --> Size : 16 | Value : 00589A00

/* -- Client -- */

[read] --> Size : 4 | Value : 6
[type2] --> Size : 2 | Value : 25
[vec2] --> Size : 4 | Value : 00000000

Press any key to continue...
memcpy(&buffer[written], &vec, sizeof(vec));

你在这里已经有问题了,甚至在收到任何东西之前。

sizeof(vec)std::vector<int> 的大小。这可能是 8 或 16 个字节,或类似的东西。向量的大小将始终相同,无论向量是空的,还是包含百科全书中每一页的图像。

向量和向量中的内容是两个完全不同的东西。

向量的size()方法给出了向量中值的个数,所以上面显然应该是:

    memcpy(&buffer[written], vec.data(), vec.size()*sizeof(int));

其余代码应相应调整。

同样,反序列化成vector的过程也是错误的,如图代码:

    std::vector<int>* vec2;

这是一个指向向量的指针。在 C++ 中,在使用指针之前,必须将其初始化为指向相同类型的现有实例。显示的代码中没有任何内容可以做到这一点。

    memcpy(&vec2, &buffer[read], sizeof(vec2));

因为 vec2 是一个指针,所以 sizeof(vec2) 将是指针的大小:4 或 8 个字节。这会尝试反序列化指针的原始内存地址。同样,这没有任何意义。

显示的代码试图执行的操作应该是:

  1. 声明你的向量

     std::vector<int> vec2;
    
  2. 确定将多少个值读入矢量,并调整其大小。例如,如果您知道有 n 字节的原始整数数据要反序列化:

     vec2.resize(n / sizeof(int));
    

此时可以将原始数据复制到指针中。

    memcpy(vec2.data(), &buffer[written], n);

由于调整大小,此方法效率稍低,但这是次要问题。也可以以对 C++ 更友好的方式实现此逻辑,但这也是次要问题。主要问题是您的 sizeof 不会神奇地为您提供将读入向量的字节数。这是您需要自己跟踪的事情。 C++ 能为您做的事情很少,您总是必须完成所有工作。您需要弄清楚如何跟踪读取的实际字节数,这些字节数构成向量的内容,然后相应地调整大小并读入向量。