c++ - 这是正确的方法吗?如何将十六进制值转换为 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++;
解决方案
如果您只想使用您暗示的网络字节顺序将一个可以用 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);
推荐阅读
- spring - 如何在 JUnit 中模拟 Files.copy 方法
- neo4j - 无法通过 cypher-shell 执行脚本
- javascript - Wordpress 块:registerBlockType 编辑函数中的异步 REST 调用
- c# - 在浏览器中读取智能卡时出现问题
- javascript - 如何突出显示从单独网页链接到的文本?
- html - 2 个 div 并排内联,一个可以在不可见时增长
- algorithm - 如何找到函数的增长率?
- django - django_filters 按字段过滤不工作
- c++ - 宏的参数可以传递给char数组的变量吗?
- python - request 模块有效,但 FormRequest 无效