Как вставить Char ** в вектор uin8_t? - PullRequest
0 голосов
/ 07 июня 2019

Я работаю над функцией кодирования данных в буфер.У меня уже есть функции для части кодирования.

Я кодирую, а затем я возвращаюсь в вектор uint8_t, который является моим выходным буфером.Для ints у меня нет проблем, я использую свою функцию, и все готово, но теперь мне нужно кодировать строку.

Уже есть функция, созданная некоторыми разработчиками до меня, которая принимает в качестве аргумента char ** (буфер для заполнения), size_t * и char * - строка, которую я собираюсь кодировать.

Для char * я просто делаю .c_str () со своей строкой в ​​моем объекте C ++, но яне знаю, что делать с буфером для заполнения, потому что я на самом деле использую вектор 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 Ответ

1 голос
/ 07 июня 2019

Кодирующая часть должна выглядеть как

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());
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...