如何将 int 复制到 u_char*

How to copy int to u_char*

我有一个 u_char* 动态数组,其中包含一些网络数据包的二进制数据。我想用一些整数值更改数据包中的目标端口号。假设数据包内的端口号偏移量为ofs,长度为4字节

我尝试了以下两种方法:

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

// Read packet from network ...

int new_port = 1234;

方法一:

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

方法二:

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 在您的平台上有多少字节,也不知道您尝试使用什么协议,所以我不得不猜测。)

您不能随意编写代码并期望它能正常工作。您必须考虑您要尝试做什么并了解要求。

我的建议是查看您正在使用的网络协议的规范,并准确找出数据中的哪些字节必须更改以及它们必须更改为什么。然后根据网络协议规范编写代码将每个字节更改为正确的值。这将确保您的代码在任何平台上都能正常工作。