这是正确的方法吗?如何将十六进制值转换为字符数组?
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);
我需要跟随 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);