我有一个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);
这两种方法都为端口号提供垃圾值(但包的其余部分都可以)。有人可以帮我吗?
答案 0 :(得分:3)
您必须将平台使用的任何内部表示形式的整数转换为通过网络发送时要求使用的特定网络协议的格式。
这取决于您要使用的特定网络协议-检查其文档以准确了解其需要表示端口的格式。我敢打赌,它是网络字节顺序。您可能具有类似htons
的功能,可以将短裤转换为网络字节顺序。
另一个问题-您平台上的int
有多少字节?网络协议用来表示端口的字节数是多少?我敢打赌,数字分别是4和2。这是另一个问题。 (或者也许不是。我不确定int
在您的平台上有多少字节,也不知道您要使用哪种协议,所以我不得不猜测。)< / p>
您不能随便编写代码并期望它能工作。您必须考虑自己要做什么并理解要求。
我的建议是查看正在使用的网络协议的规范,并准确找出数据中哪些字节必须更改以及必须更改为哪些字节。然后编写代码以根据网络协议规范将每个字节更改为正确的值。这样可以确保您的代码在任何平台上都能正常工作。