You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将整数转换为十六进制值存入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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.04 22:30:00