将 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] = ' ';
}
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_
成员的内容。
相关文章:
- NS3 - python.h 文件无法定位编译错误
- 设置我的应用程序 API 感知并防止系统使其模糊和错误定位
- c++ 链接器错误"针对'.rodata.str1.1'的重新定位R_X86_64_32"链接 CXX 共享库 libsrt.so
- R 包安装错误:重新定位 0 具有无效的符号索引 11
- Visual Studio 2019 不会打开包含源文件的窗口,也不会定位为出现错误的行
- 在函数内部错误定位后,从函数中释放返回的指针会导致芯片崩溃
- llvm错误:重新定位尚未实现!在orcjit或lli中运行RxCpp时
- 从函数返回错误定位的指针,是否会导致内存泄漏
- TC++PL书中练习中向量ctor的定位错误
- 将 std::vector 的缓冲区替换为错误定位的字符数组
- 打印以定位错误代码块
- 无法编译和定位错误
- C++ Qt MingW 错误的重新定位0xc rdata 部分中的地址
- 错误的重新定位地址0x0在 python.data C 扩展中
- 链接器错误:未定义的引用/错误的重新定位地址/ld返回1个出口
- 如何定位WinRT异步方法调用中出现错误的位置
- libstdc++.so.6的重新定位错误
- 无法定位错误cpp linux
- 使用extern时gcc的重定位错误
- 对话框定位错误