C ++ - Преобразование векторных элементов char в одиночный uint64 - PullRequest
0 голосов
/ 16 апреля 2020

У меня есть вектор, который содержит байтовые данные (символы), полученные из сокета. Эти данные содержат различные типы данных, которые я хочу извлечь. Например, первые 8 элементов (8 байтов) вектора являются uint64_t. Теперь я хочу преобразовать эти первые 8 байтов в один uint64. Обходной путь, который я нашел:

// recv_buffer is the vector containing the received Bytes
std::vector<uint64_t> frame_number(recv_buffer.begin(), recv_buffer.begin() + sizeof(uint64_t));
uint64_t frame_num = frame.number.at(0);

Есть ли способ извлечь данные без создания нового вектора?

Ответы [ 2 ]

0 голосов
/ 16 апреля 2020

Вы можете выполнить преобразование байта за байтом так:

int main()
{
    unsigned char bytesArray[8];

    bytesArray[0] = 0x05;
    bytesArray[1] = 0x00;
    bytesArray[2] = 0x00;
    bytesArray[3] = 0x00;
    bytesArray[4] = 0x00;
    bytesArray[5] = 0x00;
    bytesArray[6] = 0x00;
    bytesArray[7] = 0x00;
    bytesArray[8] = 0x00;

    uint64_t intVal = 0;

    intVal = (intVal << 8) + bytesArray[8];
    intVal = (intVal << 8) + bytesArray[7];
    intVal = (intVal << 8) + bytesArray[6];
    intVal = (intVal << 8) + bytesArray[5];
    intVal = (intVal << 8) + bytesArray[4];
    intVal = (intVal << 8) + bytesArray[3];
    intVal = (intVal << 8) + bytesArray[2];
    intVal = (intVal << 8) + bytesArray[1];
    intVal = (intVal << 8) + bytesArray[0];

    cout<<intVal;

    return 0;
}
0 голосов
/ 16 апреля 2020

Вы можете сделать это с помощью приведения, но обратите внимание, что это может привести к UB:

uint64_t *frame_num = (uint64_t*)recv_buffer.data();

Это очень не сохранить, поэтому, если вы найдете другое решение, используйте вместо него другое.
Чтобы привести его к новому целому вектору, вы можете использовать reinterpret_cast, но опять же, очень небезопасно!

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