我正在研究一个将数据编码到缓冲区的函数。我已经有编码部分的功能。
我正在编码,然后推回uint8_t向量,这是我的输出缓冲区。 对于整数,我没有问题,我使用我的函数,一切都完成了,但是现在我必须编码一个字符串。
在我之前已经有一些开发人员创建的函数,该函数将参数char **(要填充的缓冲区),size_t *和char *作为我要编码的字符串作为参数。
对于char *,我只是在我的C ++对象中使用我的字符串执行.c_str(),但是我不知道如何填充缓冲区,因为我实际上正在使用uint8_t向量。
我考虑过创建一个临时缓冲区,然后通过强制转换将其推入向量中,这是一个好方法吗?
这是我的班级(是虚拟的母班,但是字符串在这里,所以我给你看这个):
class CDnsMessage
{
public:
CDnsMessage();
virtual ~CDnsMessage();
virtual void GetSize() = 0;
uint32_t m_ttl;
eDnsClass m_class;
eDnsType m_type;
std::string m_domain;
uint8_t m_sizeDnsCorpse;
uint8_t m_sizeDomainName;
};
编码部分:
std::vector<uint8_t>& output
char * buffer;
std::size_t* bufsz;
EncodeSmallString(*buffer,*bufsz,RR_A_msg->m_domain.c_str());
output.push_back((uint8_t)buffer)
答案 0 :(得分:1)
编码部分必须看起来像
char* buffer;
std::size_t bufsz;
EncodeSmallString(&buffer, &bufsize, RR_A_msg->m_domain.c_str());
(您传入缓冲区指针和大小的地址,该函数将为您分配缓冲区。)
现在,您需要将临时缓冲区复制到输出中。这不是强制转换,这是复制每个字节的问题。作为C ++,有无数种方法可以实现,但是类似:
for (std::size_t i = 0; i<bufsiz;i++) {
output.push_back(static_cast<uint8_t>(buffer[i]));
}
将起作用(您也可以使用std::copy
或std::vector::insert
)。
最后,您需要释放临时缓冲区。您将必须查看EncodeSmallString
的文档以了解操作方法-最有可能的答案是free
或delete[]
,具体取决于它是否分配了malloc
或new []
。
我很想重写EncodeSmallString
并将其附加到向量上,然后编写包装重载(带有现有签名),例如:
void EncodeSmallString(char** pbuf, std::size_t* pbufsiz, const char* txt) {
std::vector<uint8_t> temp;
EncodeSmallString(temp, txt);
*pbufsiz = temp.size();
*pbuf = malloc(*pbufsiz); // or new or whatever the existing code uses.
// add error handling to taste
std::copy(*pbuf, temp.begin(), temp.end());
}