首页 > 解决方案 > 这是正确的方法吗?如何将十六进制值转换为 char 数组?

问题描述

我需要char packet[] = {0x00,0x14};通过 TCP/IP 发送,这是我让它工作的唯一方法。使用该字符,我将发送数字 20,另一个可能的示例char packet[] = {0x4e,0x20};是 20000。我开始认为我完全错误地处理了这个问题。

使用此代码,我可以打印出 Int 的十六进制值。

#include <iostream>
using namespace std;

int main() {
    int num, temp, i = 1, j,k=1, r;
    char hex[50] = {};
    char paket[7] = {'0','x'};
    cout << "Input?";
    cin >> num;
    temp = num;
    while (temp != 0) {
        r = temp % 16;
        if (r < 10)
            hex[i++] = r + 48;
        else
            hex[i++] = r + 55;
        temp = temp / 16;
    }
    cout << i << endl;
    cout << "\nHex = ";
    for (j = i; j > 0; j--) {
        cout << hex[j];
        switch (k)
        {
        case 1:
            paket[2] = { hex[j] };
            break;
        case 2:
            paket[3] = { hex[j] };
            break;
        case 3:
            paket[4] = { hex[j] };
            break;
        case 4:
            paket[5] = { hex[j] };
            break;
        }
        k++;
        
    }
    cout << endl << paket;
    return 0;

这部分是我试图获得所需格式的方式,但遗憾的是它不起作用。

switch (k)
        {
        case 1:
            paket[2] = { hex[j] };
            break;
        case 2:
            paket[3] = { hex[j] };
            break;
        case 3:
            paket[4] = { hex[j] };
            break;
        case 4:
            paket[5] = { hex[j] };
            break;
        }
        k++;

标签: c++arraystcphex

解决方案


如果您只想使用您暗示的网络字节顺序将一个可以用 16 位表示的数字转换为 2 个字节的数组。

int num = 20000; // or any number for that matter

char packet[2];
packet[0] = (num & 0xff00)>>8;  // 0x4E
packet[1] = (num & 0x00ff);     // 0x20

完毕。

或者,大多数网络编程使用memcpy将整数字节打包成字节数组:

uint16_t num = 20000;
char packet[2];
memcpy(packet, &num, 2);

唯一的问题是在 Little Endian 平台上,比如所有的 Intel 芯片,上面的代码都会写入{0x20, 0x4E}数组。字节的顺序错误。有一个帮助函数可以交换这些字节,称为htons。导入 htons 和类似功能的头文件因操作系统平台而异,但随处可用。

uint16_t num = 20000;
char packet[2];
num = htons(num);       // swaps bytes on little endian, no-op on big-endian
memcpy(packet, &num, 2);

推荐阅读