gpt4 book ai didi

c++ - 用 malloc'ed char 数组替换 std::vector 的缓冲区

转载 作者:行者123 更新时间:2023-11-30 05:28:33 29 4
gpt4 key购买 nike

我有以下类持有 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 加密,这需要另一个相同大小的临时缓冲区来生成密文,然后必须将密文复制回 vector 中。

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); });
}

这似乎是一项相当昂贵的任务。有没有更好的方法让 vector 拥有临时缓冲区的所有权(我是否正确理解这些新的 std::move 和右值 move 语义用于这种东西?)

最佳答案

move 语义有助于避免复制。

然而,不是为加密数据分配缓冲区,而是使用 vector 。然后,您可以使用 std::move 替换 packetdata_ 成员的内容。

关于c++ - 用 malloc'ed char 数组替换 std::vector 的缓冲区,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36780460/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com