Я действительно копирую байты или я копирую символы в этом случае? - PullRequest
0 голосов
/ 19 октября 2018

У меня есть вектор беззнакового символа, куда я копирую байты в C ++.Я конвертирую все примитивные типы в байты и копирую в этот вектор символа char (который интерпретируется как байты в C ++).Теперь я копирую также строки.Но я не уверен, преобразовываю ли я строки в байты.Если вы посмотрите на мой вывод, когда у меня printing the vector беззнакового символа, я печатаю байты из double int float, но я печатаю реальную строку моей переменной testString.Так что я полагаю, что я не вставляю байты этого testString в мой вектор неподписанного символа.Как мне это сделать?Спасибо

    const std::string lat = "lat->", alt = "alt->", lon = "lon->", testString = "TEST-STRING";
    double latitude = 10.123456;
    double longitude = 50.123456;
    double altitude = 1.123456;

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

    std::cout << "copying to the vector" << std::endl;
    memcpy(result.data(), &longitude, sizeof(longitude));
    memcpy(result.data() + sizeof(longitude), &latitude, sizeof(latitude));
    memcpy(result.data() + sizeof(longitude) + sizeof(latitude), &altitude, sizeof(altitude));
    memcpy(result.data() + sizeof(longitude) + sizeof(latitude) + sizeof(altitude), testString.c_str(),
           testString.length() + 1);
    std::cout << "copied to the vector\n" << std::endl;

    std::cout << "printing the vector" << std::endl;
    for (unsigned 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 dLat, dLon, dAlt;
    std::string value;

    memcpy(&dLon, result.data(), sizeof(longitude));
    memcpy(&dLat, result.data() + sizeof(longitude), sizeof(latitude));
    memcpy(&dAlt, result.data() + sizeof(longitude) + sizeof(latitude), sizeof(altitude));
    value.resize(testString.length());
    memcpy(&value[0], result.data() + sizeof(longitude) + sizeof(latitude) + sizeof(altitude),
           sizeof(value.data()) + testString.size());

    std::cout << alt << dAlt;
    std::cout << lat << dLat;
    std::cout << lon << dLon;
    std::cout << " " << value << std::endl;
    std::cout << "printed back the original value\n" << std::endl; 

вывод:

copying to the vector
copied to the vector

printing the vector
[?�gI@m���5?$@l������?TEST-STRING
printed the vector

printing back the original value
alt->1.12346lat->10.1235lon->50.1235 TEST-STRING
printed back the original value

Ответы [ 2 ]

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

Я чувствую, что вы ожидаете что-то вроде: 128565TESTSTRING, где 12, 85 и 65 - это значения долготы, широты и высоты.Ну, этого не произойдет, потому что вы написали 12 в данных, а не "12";следовательно, он вернет вам символ, код ASCII которого 12.Может быть, вы могли бы использовать что-то вроде sprintf() вместо

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

Нет проблем с вашим кодом!Вы печатаете фактические байты ваших переменных.Байты в double не могут действительно интерпретироваться как текстовая строка (по крайней мере, это не имеет смысла, если вы это делаете), но байты в текстовой строке могут , создавая то, что вы видите.

Допустим, у вас есть следующий код (который на самом деле просто замаскирован C):

#include <cstdio>

int main(int argc, char *argv[]) {
    struct {
        double latitude;
        double longitude;
        char name[30];
    } structure = {
        53.6344,
        126.5223167,
        "Keyboard Mash"
    };
    printf("%f %f %s\n", structure.latitude, structure.longitude, structure.name);
    for (size_t i = 0; i < sizeof(structure); i += 1) {
        printf("%c", ((char*)&structure)[i]);
    }
    printf("\n");
}

Этот код (вероятно) напечатает:

53.6344 126.5223167 Keyboard Mash
����������������Keyboard Mash�����������������

Первые 16 байтов от double с, а следующие 30 от char[].Вот как хранятся char[] s!Ваш код делает то, что вы ожидаете.

Конечно, вы не можете полагаться на то, что он делает это именно так;это неопределенное поведение.

...