这是正确的方法吗?如何将十六进制值转换为字符数组?

Is this the right way? How to get Hex value into a char array?

我需要跟随 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++;

如果你只是想将一个不能用 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 和类似函数的头文件因 OS 平台而异,但随处可用。

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