簡體   English   中英

用 malloc 的字符數組替換 std::vector 的緩沖區

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

我有以下類將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] = '\0';
            }
            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和右值移動語義用於此類內容?)

移動語義可以幫助避免復制。

然而,不是 malloc'ing 加密數據的緩沖區,而是使用向量。 然后,您可以使用std::move替換packetdata_成員的內容。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM