Недавно я задал здесь вопрос о переполнении стека о том, как преобразовать мои данные из 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 ()? В качестве бонуса, если бы кто-то мог помочь объяснить исходный код, чтобы я знал на будущее, как он работает (в частности, как работает переключение в этом случае и почему это необходимо), это могло бы значительно углубить мое понимание на будущее.
Заранее спасибо!