将 std::vector 的缓冲区替换为错误定位的字符数组

Replace std::vector's buffer with a malloc'ed char array

本文关键字:定位 错误 字符 数组 缓冲区 std vector 替换      更新时间:2023-10-16

我有以下类保存一个std::vector作为数据的可调整大小的"缓冲区"。

class packet
{
public:
    struct PacketHeader
    {
        size_t dataSize = 0;
        size_t paddedDataSize = 0;
    } header_;
    const unsigned char* data() const
    {
        return &data_[0];
    }
    unsigned char* data()
    {
        return &data_[0];
    }
    /// changes the size of the data vector
    void resize(size_t sz)
    {
       header_.dataSize = sz;
        // check if padding is needed
        if (sz % AES_BLOCK_SIZE != 0){
            auto padding = AES_BLOCK_SIZE - (sz % AES_BLOCK_SIZE);      
            data_.resize(sz + padding);
            for (int i = 1; i <= padding; i++)
            {               
                data_[(sz + padding) - i] = '';
            }
            header_.paddedDataSize = sz + padding;
        } else{         
            data_.resize(sz);
        }
    }
private:    
    std::vector<unsigned char> data_;   
};
然后,

在通过网络传输数据之前,我对数据执行一些AES加密,这需要另一个相同大小的临时缓冲区来生成密文,然后必须将其复制回向量。

void TcpConnection::send_packet(packet& pkg)
{
    // I cut out all the unrelevant lines of code
    // We need a temporary buffer for the encryption
    unsigned char* enc_out = (unsigned char*)malloc(pkg.header_.paddedDataSize);
    // AES-128 bit CBC encryption
    aes_cbc_encrypt(pkg.data(), enc_out, pkg.header_.paddedDataSize);
    // now I need to copy all the data back from the temporary buffer into the objects vector
    memcpy(pkg.data(), enc_out, pkg.header_.paddedDataSize);    
    free(enc_out);
    io_service_.post([this, pkg]() { transmit(pkg); });
}

这似乎是一项相当昂贵的任务。难道没有更好的方法,让向量获得临时缓冲区的所有权(我是否正确理解这些新的std::move和右值移动语义用于这种事情?

Move 语义可以帮助避免复制。

但是,不要错误地分配加密数据的缓冲区,而是使用向量。然后,您可以使用std::move替换packet data_成员的内容。