В C ++ относительно битового сдвига и преобразования типов данных

Недавно я задал здесь вопрос о переполнении стека о том, как преобразовать мои данные из 16-битного целого числа, за которым следует неопределенный объем памяти void * -cast, в std :: vector беззнаковых символов для использования библиотека сокетов, известная как NetLink, которая использует функцию, подпись которой выглядит так для отправки необработанных данных:

void rawSend(const vector* data);

(для справки, вот этот вопрос: Приведение беззнакового int + строки к беззнаковому вектору char )

На вопрос успешно дан ответ, и я благодарен тем, кто ответил. Майк ДеСимоун ответил примером функции send_message (), которая преобразует данные в формат, который принимает NetLink (std :: vector), который выглядит следующим образом:

void send_message(NLSocket* socket, uint16_t opcode, const void* rawData, size_t rawDataSize)
{
    vector buffer;
    buffer.reserve(sizeof(uint16_t) + rawDataSize);
    buffer.push_back(opcode >> 8);
    buffer.push_back(opcode & 0xFF);
    const unsigned char* base(reinterpret_cast(rawData));
    buffer.insert(buffer.end(), base, base + rawDataSize);
    socket->rawSend(&buffer);
}

Похоже, это именно то, что мне нужно, и поэтому я отправился писать сопутствующую функцию receive_message () ...

... но мне неловко сказать, что я не совсем понимаю все битовые сдвиги и тому подобное, поэтому я наткнулся на стену . Во всем коде, который я когда-либо писал за последние почти десять лет, большая часть моего кода была на языках более высокого уровня, а остальная часть моего кода никогда не требовала операций с памятью более низкого уровня.

Возвращаясь к теме написания функции receive_message (), моей отправной точкой, как вы могли догадаться, является функция NetLink rawRead (), подпись которой выглядит так:

vector* rawRead(unsigned bufferSize = DEFAULT_BUFFER_SIZE, string* hostFrom = NULL);

Похоже, мой код начинается примерно с это:

void receive_message(NLSocket* socket, uint16_t* opcode, const void** rawData)
{
    std::vector>* buffer = socket->rawRead();
    std::allocator allocator = buffer->get_allocator(); // do I even need this allocator?  I saw that one is returned as part of the above object, but...
    // ...
}

После этого первого вызова rawRead (), похоже, мне нужно будет выполнить итерацию по вектору, извлечь из него данные и обратить операции сдвига битов, а затем вернуть данные в * rawData и * код операции.Опять же, я не очень хорошо знаком со сдвигом битов (я немного погуглил, чтобы понять синтаксис, но я не понимаю , почему приведенный выше код send_message () вообще требует сдвига), поэтому я потеря для моего следующего шага здесь.

Может ли кто-нибудь помочь мне понять, как написать эту сопутствующую функцию receive_message ()? В качестве бонуса, если бы кто-то мог помочь объяснить исходный код, чтобы я знал на будущее, как он работает (в частности, как работает переключение в этом случае и почему это необходимо), это могло бы значительно углубить мое понимание на будущее.

Заранее спасибо!

5
задан Community 23 May 2017 в 12:19
поделиться