如何将整数转换为十六进制值存入char数组用于TCP/IP传输
问题核心错误点
- 你混淆了代码中的十六进制字面量和实际传输的二进制字节值:你要发送的
0x00、0x14是字节本身的数值,不是由'0'、'x'、'1'、'4'组成的字符串,你现在写的代码在拼十六进制可读字符串,和需求完全不沾边。 - 你的需求本质是把int类型的整数转成大端序(网络字节序)的2字节数组,和你给出的示例完全匹配:
数值20 → 0x00 0x14(对应16位无符号大端表示)
数值20000 → 0x4E 0x20(20000转十六进制是0x4E20,大端规则就是高位字节在前)
正确实现方案
不需要做字符串拼接,直接通过位运算拆分字节,或者用标准库的网络字节序转换函数即可,两种实现如下:
位运算手动拆分(无额外依赖)
#include <iostream> #include <cstdint> using namespace std; int main() { uint16_t num; // 你示例的数值都在16位无符号范围内,用固定宽度类型避免平台差异 cout << "Input?"; cin >> num; // 直接拆分大端字节,高位在前存入数组 char packet[2]; packet[0] = (num >> 8) & 0xFF; // 取高8位 packet[1] = num & 0xFF; // 取低8位 // 测试打印验证结果 cout << "生成的字节数组:0x" << hex << (uint16_t)(uint8_t)packet[0] << " 0x" << (uint16_t)(uint8_t)packet[1] << endl; // 后续直接把packet数组通过TCP发送即可,发送长度为2字节 return 0; }
标准库函数实现(兼容多平台)
#include <iostream> #include <cstdint> #include <cstring> // Linux/macOS下加#include <arpa/inet.h>,Windows下加#include <winsock2.h> using namespace std; int main() { uint16_t num; cout << "Input?"; cin >> num; uint16_t net_num = htons(num); // htons直接把主机序转为网络字节序(大端) char packet[2]; memcpy(packet, &net_num, 2); // 直接拷贝到char数组 // 测试打印验证结果 cout << "生成的字节数组:0x" << hex << (uint16_t)(uint8_t)packet[0] << " 0x" << (uint16_t)(uint8_t)packet[1] << endl; return 0; }
如果需要传输32位整数,同理扩展即可:
uint32_t num = 要传输的数值; char packet[4]; packet[0] = (num >> 24) & 0xFF; packet[1] = (num >> 16) & 0xFF; packet[2] = (num >> 8) & 0xFF; packet[3] = num & 0xFF;
原代码不生效的原因
你构造的paket数组存的是十六进制字符的ASCII值,比如数值20转出来的是'0'、'x'、'1'、'4',对应的字节值是0x30、0x78、0x31、0x34,和你需要的0x00、0x14完全不是同一类数据,自然无法达到预期效果。
内容的提问来源于stack exchange,提问作者Hatux
相关产品推荐
相关产品推荐

