我有一个动态数组,它有一些网络包的二进制数据。我想用一些整数值改变包中的目的端口号。假设数据包中的端口号偏移量u_char*,长度为4字节。
我尝试了以下两种方法:

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在你的平台上有多少字节,也不知道你想用什么协议,所以我只能猜测。)
你不能只是随意地写代码然后期望它能工作。你必须考虑你要做什么,并理解需求。
我的建议是查看您正在使用的网络协议的规范,并确定数据中的哪些字节必须更改,以及它们必须更改为什么。然后编写代码,根据网络协议规范将每个字节更改为正确的值。这将确保您的代码在任何平台上都能正常工作。

关于c++ - 如何将int复制到u_char *,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/54855530/

10-11 23:03
查看更多