【问题标题】:Is this the right way? How to get Hex value into a char array?这是正确的方法吗?如何将十六进制值转换为 char 数组?
【发布时间】:2021-11-04 22:52:50
【问题描述】:

我需要关注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++;

【问题讨论】:

  • 请不要使用magic numbers。如果 48 是指 '0' 的 ASCII 值,则使用实际字符。
  • 至于您的问题,请记住十进制、十六进制甚至八进制只是表示底层 二进制 值的不同方式。如果你想要一个十六进制数字的字符串,为什么不使用snprintf,比如snprint, paket, sizeof paket, "0x%04x", num)?或者考虑到您正在使用 C++ 编程,请使用某种流(例如 std::ostringstream)。
  • 没有“十六进制值”之类的东西。计算机中的一切都是二进制的。十六进制只是人类使用的符号。您的问题不清楚。

标签: c++ arrays tcp hex


【解决方案1】:

如果您只想使用网络字节顺序将一个可以用 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。用于导入 hton 和类似功能的头文件因操作系统平台而异,但随处可用。

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

【讨论】:

  • memcpy 正是我上周一直在寻找的。我知道 htons,这实际上是我一直在尝试解决我从未找到 memcpy 的问题时一直在寻找的东西。
  • 现在可行,但我有两个新问题。第一次发送每两次工作,必须找出为什么可能会为此打开一个新问题或编辑一个旧问题。第二个问题,您可能可以提供帮助。我从窗口GetWindowText(hWndEdit, buffer, 1024);````buffer is an wchar_t`得到一个输入我使用int Input = _wtoi(buffer);将它转换为一个int有没有办法将int与memcpy一起使用或者有没有办法将int转换为uint16_t?
  • 是的 memcpy 与 int 一起工作,只是让它工作。现在我必须找出为什么它只能每秒钟起作用一次。
猜你喜欢
  • 2012-07-23
  • 2017-11-13
  • 2011-05-25
  • 2015-06-04
  • 2011-08-12
  • 1970-01-01
  • 2022-11-25
  • 2012-02-24
  • 2017-04-21
相关资源
最近更新 更多