У меня есть динамический массив 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);
Оба метода дают мусорное значение для номера порта (но остальная часть пакета в порядке). Кто-нибудь может мне помочь?
Почему вы вообще ожидаете, что это сработает? Есть ли у вас основания полагать, что ваша платформа просто представляет целые числа внутри памяти в точно таком же формате, который сеть использует для отправки их по сети в виде потока байтов?
Когда вы говорите мусор, что вы имеете в виду? И что вы ожидаете увидеть?





Вы должны преобразовать целое число из любого внутреннего представления, используемого вашей платформой, в формат, который требует конкретный сетевой протокол, который вы используете, при отправке по сети.
Это зависит от конкретного сетевого протокола, который вы пытаетесь использовать - проверьте его документацию, чтобы точно определить формат, в котором он требует, чтобы порты были выражены. Моя ставка будет на сетевой порядок байтов. Вероятно, у вас есть такие функции, как htons, для преобразования шорт в сетевой порядок байтов.
Еще одна проблема — сколько байт int на вашей платформе? Сколько байтов использует сетевой протокол для выражения портов? Держу пари, что числа 4 и 2 соответственно. Так что это еще одна проблема. (А может быть, это и не так. Я точно не знаю, сколько байтов занимает int на вашей платформе, и не знаю, с каким протоколом вы пытаетесь работать, поэтому мне приходится гадать.)
Вы не можете просто написать код случайным образом и ожидать, что он будет работать. Вы должны думать о том, что вы пытаетесь сделать, и понимать требования.
Я бы порекомендовал посмотреть спецификацию сетевого протокола, с которым вы работаете, и выяснить, какие именно байты в данных должны измениться и на что они должны измениться. Затем напишите код для изменения каждого байта на правильное значение в соответствии со спецификацией сетевого протокола. Это обеспечит правильную работу вашего кода на любой платформе.
Метод №1 работал, когда я использовал htonl(new_port). Спасибо :)
Учитывайте
memmove