Безопасность интерпретации целого числа как байтового массива - PullRequest
0 голосов
/ 06 апреля 2019

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

Вместо преобразования значения int64_t в символьную строку, безопасно ли переосмыслить его как двоичную строку для транспорта ... затем обратно в int64_t по прибытии?

на клиенте ..

int64_t timeValue = 1554532128;
std::basic_string<char> timeString((const char *)timeValue, sizeof(int64_t));

и затем на сервере ..

std::basic_string<char> timeString;
int64_t timeValue = (int64_t)(*timeString.data());

1 Ответ

2 голосов
/ 06 апреля 2019

Безопасно использовать указатель char* для доступа к необработанным байтам переменной, в стандарте C ++ есть положения для этого использования.Но вы не конвертируете свои значения правильно с обеих сторон.Код должен выглядеть примерно так:

int64_t timeValue = ...;
std::string timeString(reinterpret_cast<char*>(&timeValue), sizeof(int64_t));

std::string timeString = ...;
//assert(timeString.size() == sizeof(int64_t));
int64_t timeValue = *reinterpret_cast<int64_t*>(timeString.data());
...