如何将Char **推入uin8_t向量?

时间:2019-06-07 09:52:57

标签: c++ vector buffer

我正在研究一个将数据编码到缓冲区的函数。我已经有编码部分的功能。

我正在编码,然后推回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)

1 个答案:

答案 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::copystd::vector::insert)。

最后,您需要释放临时缓冲区。您将必须查看EncodeSmallString的文档以了解操作方法-最有可能的答案是freedelete[],具体取决于它是否分配了mallocnew []

我很想重写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());
}