c++ - 如何将 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);
两种方法都为端口号提供垃圾值(但数据包的其余部分都可以)。谁能帮助我?
解决方案
您必须将整数从您的平台碰巧使用的任何内部表示转换为您正在使用的特定网络协议要求它们在通过网络发送时使用的格式。
这取决于您尝试使用的特定网络协议 - 检查其文档以准确了解它需要表达端口的格式。我敢打赌它是网络字节顺序。您可能具有htons
将短裤转换为网络字节顺序的功能。
另一个问题——你的平台上有多少字节int
?网络协议使用多少字节来表示端口?我敢打赌,这两个数字分别是 4 和 2。所以这是另一个问题。(或者可能不是。我不确定int
你的平台上有多少字节,也不知道你正在尝试使用什么协议,所以我不得不猜测。)
您不能只是随机编写代码并期望它能够工作。您必须考虑您正在尝试做什么并了解要求。
我的建议是查看您正在使用的网络协议的规范,并准确确定数据中的哪些字节必须更改以及它们必须更改的内容。然后根据网络协议规范编写代码将每个字节更改为正确的值。这将确保您的代码在任何平台上都能正常工作。
推荐阅读
- c++ - 我的代码有什么问题我尝试解决 leencode 问题(36。有效数独)当我运行此按摩显示 AddressSanitizer:DEADLYSIGNAL 的代码时
- react-native - React Native Pressable 在滚动时可取消
- angular - 无法从“sockjs-client”(打字稿)导入
- javascript - 将数组中的值分组和计数到对象中
- python - TypeError:__init__() 缺少 1 个必需的位置参数:'successor
- c++ - 错误 - f 未在此范围内声明 - 割线方法
- python - 使用递归检查列表中元组的总和
- python - 当我创建 2 个内容相同但技术不同的数组时,一个对行操作很奇怪
- angular - Dynamically Get "this" value based on a string variable Typescript
- java - 如何将数据公开到手动触发的表盘