Как использовать несколько раз memcpy для преобразования обратно std :: vector? - PullRequest
0 голосов
/ 11 октября 2018

Я хочу преобразовать набор значений strings, doubles и time_t в std::vector<unsigned char> в C ++.Я использую memcpy для этого и вызываю его каждый раз, когда у меня есть новое значение.Я только что понял, что должен назвать это задом наперед, чтобы объединить правильный порядок на моем векторе.После того, как я конвертирую все свои значения, я хочу конвертировать обратно.То, что я делаю, - это каждый раз снова вызывать memcpy, чтобы вернуть исходное значение обратно.Но так как значения после первого находятся в середине вектора, я не могу преобразовать его обратно должным образом.

Как мне преобразовать все значения из вектора отдельно?Мой код ниже и вывод тоже.Спасибо

int main(void) {
    std::string lat = "lat->";
    double latitude = 13.123456;

    std::vector<unsigned char> result(sizeof(lat) + sizeof(latitude));

    std::cout << "copying to the vector" << std::endl;
    memcpy(result.data(), &latitude, sizeof(latitude)); // add string to the vector
    memcpy(result.data(), &lat, sizeof(result.size()) + sizeof(lat)); // add double to the same vector
    std::cout << "copied to the vector\n" << std::endl;

    std::cout << "printing the vector" << std::endl;
    for (int j = 0; j < result.size(); j++) {
        std::cout << result[j];
    }
    std::cout << std::endl;
    std::cout << "printed the vector\n" << std::endl;

    // testing converting back ...................
    std::cout << "printing back the original value" << std::endl;
    double d;
    std::string value;
    // make sure the vector is the right size
    if (result.size() != (sizeof(d) + sizeof(lat)))
        throw std::runtime_error {
                "Size of data in vector and float do not match" };
    // copy the bytes into the float
    memcpy(&value, result.data(), sizeof(value));
    std::cout << value;
    memcpy(&d, result.data(), sizeof(value) + sizeof(d));
    std::cout << d << std::endl;
    std::cout << "printed back the original value\n" << std::endl;
}

Вывод:

copying to the vector
copied to the vector

printing the vector
��(�lat->Pş0��(�
printed the vector

printing back the original value
lat->6.95297e-310
printed back the original value

Segmentation fault (core dumped)

1 Ответ

0 голосов
/ 11 октября 2018

Как я сказал в комментариях, не делайте такого рода вещи, если только вы не знаете, что делаете (чего не делали).

Запись в буфер памяти:

std::string lat = "lat->";
double latitude = 13.123456;

std::vector<unsigned char> result(lat.length() + sizeof(latitude));

std::cout << "copying to the vector" << std::endl;
std::memcpy(result.data(), &latitude, sizeof(latitude));             // add double
std::memcpy(result.data()+sizeof(latitude), lat.data(), lat.size()); // add raw string data
std::cout << "copied to the vector\n" << std::endl;

Обратите внимание, что указатель назначения, переданный на memcpy, отличается для двух вызовов, каждый раз указывая на память, которая ранее не использовалась.

При чтении строки с помощью memcpy требуется осторожность:

double d;
std::string value;
std::memcpy(&d, result.data(), sizeof(latitude));    // copy back the bytes of the double
value.resize(lat.length());
std::memcpy(value.data(),result.data()+sizeof(latitude), value.data(), lat.size());

Вы видите, что нам нужно знать количество символов (lat.size()), прежде чем мы сможем скопировать их из буфера.Это делает весь подход сомнительным в лучшем случае.Я настоятельно рекомендую, чтобы после понимания этого примера вы больше не занимались подобными вещами.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...