Как скопировать int в u_char * - PullRequest
0 голосов
/ 24 февраля 2019

У меня есть динамический массив u_char*, содержащий двоичные данные какого-либо сетевого пакета.Я хочу изменить номер порта назначения в пакете с некоторым целочисленным значением.Предположим, что смещение номера порта в пакете составляет ofs с длиной 4 байта.

Я попробовал следующие 2 метода:

u_char* packet = new u_char[packet_size]; // Packet still empty

// Read packet from network ...

int new_port = 1234;

Метод # 1:

std::copy((u_char*)&new_port, (u_char*)&new_port+4, packet+ofs);

Метод № 2:

std::string new_port_str = std::to_string(new_port);
auto new_port_bytes = new_port_str.c_str();
std::copy(new_port_bytes, new_port_bytes+4, packet+ofs);

Оба метода дают значение мусора для номера порта (но с остальной частью пакета все в порядке).Кто-нибудь может мне помочь?

1 Ответ

0 голосов
/ 24 февраля 2019

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

Это зависит отКонкретный сетевой протокол, который вы пытаетесь использовать - проверьте документацию, чтобы точно определить формат, в котором требуется указывать порты. Моя ставка будет в порядке сетевых байтов.Возможно, у вас есть такие функции, как htons для преобразования шорт в сетевой порядок байтов.

Еще одна проблема - сколько байт int на вашей платформе?Сколько байтов использует сетевой протокол для экспресс-портов?Держу пари, числа 4 и 2 соответственно.Так что это еще одна проблема.(Или, может быть, это не так. Я не знаю точно, сколько байтов int находится на вашей платформе, и я не знаю, с каким протоколом вы пытаетесь работать, поэтому я должен догадаться.)

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

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

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