Я работаю с библиотекой сокетов NetLink (https://sourceforge.net/apps/wordpress/netlinksockets/) и хочу отправить некоторые двоичные данные по сети в указанном формате.
Формат, который я запланировалдовольно прост и выглядит следующим образом:
Байты 0 и 1: код операции типа uint16_t (т. е. целое число без знака всегда длиной 2 байта)
2 байта и более: любые другие необходимые данные, такие как строка, целое число, комбинация каждого и т. Д., Другая сторона будет интерпретировать эти данные в соответствии с кодом операции.Например, если код операции равен 0, что означает «вход в систему», эти данные будут состоять из целого числа в один байт, указывающего длину имени пользователя, сопровождаемого строкой, содержащей имя пользователя, после которой следует строка, содержащая пароль.Для кода операции 1 «отправить сообщение чата» все данные здесь могут быть просто строкой сообщения чата.
Вот то, с чем библиотека дает мне работать для отправки данных,хотя:
void send(const string& data);
void send(const char* data);
void rawSend(const vector<unsigned char>* data);
Я предполагаю, что хочу использовать rawSend () для этого ... но rawSend () принимает беззнаковые символы, а не пустой указатель * на память?Не будет ли здесь какая-то потеря данных, если я попытаюсь привести определенные типы данных к массиву беззнаковых символов?Пожалуйста, исправьте меня, если я ошибаюсь ... но если я прав, значит ли это, что я должен искать другую библиотеку, которая поддерживает реальную передачу двоичных данных?
Предполагая, что эта библиотека служит моим целям,Как именно я приведу и объединю свои различные типы данных в один std :: vector?Я попробовал что-то вроде этого:
#define OPCODE_LOGINREQUEST 0
std::vector<unsigned char>* loginRequestData = new std::vector<unsigned char>();
uint16_t opcode = OPCODE_LOGINREQUEST;
loginRequestData->push_back(opcode);
// and at this point (not shown), I would push_back() the individual characters of the strings of the username and password.. after one byte worth of integer telling you how many characters long the username is (so you know when the username stops and the password begins)
socket->rawSend(loginRequestData);
Однако, с другой стороны, я столкнулся с некоторыми исключениями, когда попытался интерпретировать данные.Я все неправильно подхожу к кастингу?Собираюсь ли я потерять данные путем приведения к неподписанным символам?
Заранее спасибо.