首页 > 解决方案 > 如何将 int 复制到 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;

方法#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);

两种方法都为端口号提供垃圾值(但数据包的其余部分都可以)。谁能帮助我?

标签: c++cc++11networkingpacket

解决方案


您必须将整数从您的平台碰巧使用的任何内部表示转换为您正在使用的特定网络协议要求它们在通过网络发送时使用的格式。

这取决于您尝试使用的特定网络协议 - 检查其文档以准确了解它需要表达端口的格式。我敢打赌它是网络字节顺序。您可能具有htons将短裤转换为网络字节顺序的功能。

另一个问题——你的平台上有多少字节int?网络协议使用多少字节来表示端口?我敢打赌,这两个数字分别是 4 和 2。所以这是另一个问题。(或者可能不是。我不确定int你的平台上有多少字节,也不知道你正在尝试使用什么协议,所以我不得不猜测。)

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

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


推荐阅读