【问题标题】:How to push Char** into uin8_t vector?如何将 Char** 推入 uin8_t 向量?
【发布时间】:2019-06-07 09:52:57
【问题描述】:

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

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

【问题讨论】:

  • 很难理解您想要实现的目标,但 “我考虑过创建一个临时缓冲区,然后通过强制转换将其推入向量中” 听起来很糟糕。实际上你的“编码部分”看起来很错误。请edit您的问题并添加EncodeSmallString的原型。
  • 代码确实不正确。您不能将输出定义为参考,也不能对其进行设置。不能将输出作为EncodeSmallString(output) 函数的引用传递吗?

标签: c++ vector buffer


【解决方案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[],具体取决于它是使用 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());
}

【讨论】:

  • std::copy
  • @LightnessRacesinOrbit std::copy 等效项是 std::copy( std::back_inserter(output), buffer, buffer+bufsiz) (并且演员表不明确)。就我个人而言,我发现 for 循环更易于阅读,而且我认为 std::copy 没有任何优势。 YMMV。 (我也不必查找 for 循环的规范。)
  • 类型安全。永远不要写memcpy!这也不是等价的;你的memcpy 没有“插入”,它只是覆盖,所以这就是你的std::copy 需要做的所有事情
  • 你的例子中的*pbufsiz也不会编译
  • 哦,我明白了!您指的是旁边的 memcpy,而不是答案主要部分的 for-loop。我对此感觉不那么强烈。 (而memcpy(pbuf, &amp;temp[0], *pbufsiz) 将编译,但效果不佳!)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-03-05
  • 1970-01-01
  • 2020-12-18
  • 1970-01-01
  • 2021-12-31
  • 1970-01-01
相关资源
最近更新 更多