打怪升级之如何发送HEX进制的数据出去

文章讨论了如何将电脑中的string类型数据转换为整型并发送,强调无论数据类型或编码如何,内存中存储的都是二进制。通过示例代码解释了char、int和long类型的使用,以及利用atoi和sstream进行字符串与数字之间的转换。同时指出,数据的正确性至关重要,正确的%d数据天然就是HEX格式。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Hex数据老大难

不少人都困扰于如何将电脑中读取到的string类型的数据变成整形发送出去。一半来说,不论你调用的通信方式是串口的还是网络的,亦或是PCIE的,其在电脑端的实际情况都是以系统API的形式呈现的。而系统API函数提供的接口,本质上只需要两类变量即可:

1.你的数据首位地址,一半来说就是一个char*变量;
2.你的数据总共长度。

比如,如果你使用ASCII编码,一串string发送的过程就是,你将这串string的首地址告诉API,再将string的长度告诉API,然后API根据这一串数据去读取地址控件中相应长度的数据。

一个地址char 变量内保存的数据是什么,是我们比较关心的。比如,如果你使用的是char * 表示的一串数据(string),那么根据string中的每一个字符元素对应的ASCII码,才是实际内存中char代表的内容。

所谓HEX,其实无意义,因为不论是什么样的数据或者编码,在内存里其实存的都是二进制,你按16位16位的取就可以了,API发送的也是直接内存里的二进制数据。重点始终在于,我们如何整理好我们在内存中的二进制数据。

%c与%d

让我们打开天窗说亮化吧,一个char对应的保存内容是什么,由下面这个东西可以解释:


char a = 97;//%c a %d 97

char a = a;//报错

char a = 'a';//%c a %d 97

char a = "a";//报错

char a = 'WIND';//%c D %d 68

char a = '爱';//%c ? %d -46(这个后面专门再讨论)

也就是说,一个char的内存其很固定,一直都是一个8位宽字节,里面保存了一个整数,比如97。也就是说,实际API发送的东西就是%d的东西,一个char由一个8位宽字节表示,所以其范围为0到255(ASCII的总字符数少于255)。如果char a表示了一个不在ASCII里的字符,那么它一定是某个其他你暂时不知道的编码格式里的数字–文字对应表,你需要找到这样的对应表,比如UINCODE编码的本质就是一种数字–文字对应表,GBK也是。

这里我们展示三种实验:

#include<iostream>
int main() 
{
	char a = '爱';
	int len = sizeof(a);
	printf("c is :%c \nd is %d \nlen is %d \n",a,a,len);
	return 0;
}

在这里插入图片描述

#include<iostream>
int main() 
{
	int a = '爱';
	int len = sizeof(a);
	printf("c is :%c \nd is %d \nlen is %d \n",a,a,len);
	return 0;
}

在这里插入图片描述

#include<iostream>
int main() 
{
	long a = '爱';
	int len = sizeof(a);
	printf("c is :%c \nd is %d \nlen is %d \n",a,a,len);
	return 0;
}

在这里插入图片描述

我们在汉字字符集编码查询中找到如下结论:

在这里插入图片描述

可以发现,尽管你的输入是个汉字,但依然是以数字的方式与汉字对应的。你的char整形或者int整形,保存的事实上也是数字,是一串固定位宽的数据,所以你只要保证你的%d数据正确,天然的就是HEX,根本就不用特地的再转。

最后,援引一些我问大佬的结论:

'爱’这样的写法赋值,跟你所用的文本工具(比如cpp)打开后的编码方式直接相关。

如何%d的赋值

好了,现在我们考虑这样一个问题:

你有一个char a = ‘1’;

你如何把char b = 1;

赋值成这种形式?

#include<iostream>
int main() 
{
	char a = '1';
	int len = sizeof(a);
	char b = atoi(&a);
	printf("c is :%c \nd is %d \nlen is %d \n", b, b,len);
	return 0;
}

没错,用最简单的stoi或者atoi函数转换一下就可以了。

在这里插入图片描述

如何从字符串中分隔连续的数字

#include<iostream>
#include <sstream>
using namespace std;
int main() 
{
	const char* a = "10 12 14 16";
	istringstream is(a);

	string b,c,d,e;

	is >> b;
	is >> c;
	is >> d;
	is >> e;

	printf("c is :%s \n", b.c_str());
	printf("c is :%s \n", c.c_str());
	printf("c is :%s \n", d.c_str());
	printf("c is :%s \n", e.c_str());

	char p, q, s, t;

	p = atoi(b.c_str());
	q = atoi(c.c_str());
	s = atoi(d.c_str());
	t = atoi(e.c_str());


	printf("d is :%d \n", p);
	printf("d is :%d \n", q);
	printf("d is :%d \n", s);
	printf("d is :%d \n", t);

	return 0;
}

这个实验的运行结果是:

在这里插入图片描述

如果流输出不用string来接收的话,char的位宽限制,一次只能接收一个信号,你就无法获取超过10以上的,需要两个字符才能表达的数字了。

错误的做法如下:

#include<iostream>
#include <sstream>
using namespace std;
int main() 
{
	const char* a = "10 12 14 16";
	istringstream is(a);

	char b,c,d,e;

	is >> b;
	is >> c;
	is >> d;
	is >> e;

	printf("c is :%c \n", b);
	printf("c is :%c \n", c);
	printf("c is :%c \n", d);
	printf("c is :%c \n", e);


	return 0;
}

效果为:

在这里插入图片描述

这样就不是按空格分隔了,而是一个一个分隔了,就识别不了10以上的字符串了。

Adriano 可以通过使用蓝牙模块来发送十六进制数据。蓝牙是一种无线通信技术,可用于在设备之间传输数据。 要在 Adriano 上发送十六进制数据,首先需要安装和配置蓝牙模块。我们可以选择一款兼容 Arduino 的蓝牙模块,例如 HC-05 或 HC-06。 接下来,我们需要编写 Arduino 代码来实现发送十六进制数据。使用 Serial.write() 函数,我们可以将十六进制数据作为字节发送。 以下是一个示例代码片段,说明了如何使用 Adriano 发送十六进制数据: ```cpp #include <SoftwareSerial.h> SoftwareSerial btSerial(10, 11); // 使用软串口与蓝牙模块通信 unsigned char data[] = {0x12, 0x34, 0xAB, 0xCD}; // 十六进制数据 void setup() { // 初始化串口和蓝牙模块 Serial.begin(9600); btSerial.begin(9600); } void loop() { // 发送十六进制数据 for (int i = 0; i < sizeof(data); i++) { btSerial.write(data[i]); Serial.print("Sent: 0x"); Serial.println(data[i], HEX); delay(1000); } } ``` 在这个示例中,我们使用 SoftwareSerial 库来模拟一个串口来与蓝牙模块进行通信。我们首先初始化串口和蓝牙模块通信的波特率,并在主循环中使用 btSerial.write() 函数逐个字节地发送十六进制数据。同时,我们使用 Serial.print() 函数将发送数据打印到串口监视器中,以便进行调试。 通过使用类似的代码,Adriano 就可以通过蓝牙模块来发送十六进制数据了。根据你实际的需求,可能需要对代码进行进一步的调整和优化。希望这个回答对你有所帮助!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

考琪

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值