我有以下类将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
和rvalue移动语义用于这种东西?)
答案 0 :(得分:1)
移动语义有助于避免复制。
但是,不使用malloc为缓冲区加密数据,而是使用向量。然后,您可以使用std::move
替换packet
的{{1}}成员的内容。