C++ 十六进制字符数组2乘2个字符到uint8\u t
我正在为一个微控制器(mbed LPC1768)编写一个程序,在解码uint8的串行输入时遇到了一些问题 我得到一个C++ 十六进制字符数组2乘2个字符到uint8\u t,c++,c,mbed,C++,C,Mbed,我正在为一个微控制器(mbed LPC1768)编写一个程序,在解码uint8的串行输入时遇到了一些问题 我得到一个charackbuffer[20]由来自外部设备的输入填充。 我们得到的是例如:f04a34b6785121\r 我想做的是得到一个uint8_t数组,其中每个数字由两个字符的十六进制值表示。F表示来自外部设备的消息已启动,回车为每条消息的结尾 因此,我希望uint8_t数组中的内容是: 0x04 0x0A 0x34 ... 更困难的是,ackBuffer的大小可能更小,因此,例
charackbuffer[20]代码>由来自外部设备的输入填充。
我们得到的是例如:f04a34b6785121\r
我想做的是得到一个uint8_t数组,其中每个数字由两个字符的十六进制值表示。F表示来自外部设备的消息已启动,回车为每条消息的结尾
因此,我希望uint8_t数组中的内容是:
0x04
0x0A
0x34
...
更困难的是,ackBuffer的大小可能更小,因此,例如,仅F04004A\r
(如果这很容易修复,那么这很好,但我可以自己解决这个问题
谢谢!所以我假设ackMessage
必须以'F'
开头,以'\r'
结尾。我甚至假设,由于您在微控制器上工作,因此应该避免任何超出要求的操作(例如库函数)。考虑到您只需在缓冲区上迭代:
uint8_t charToHex(unsigned char value)
{
if (value >= '0' && value <= '9') return value - '0';
else if (value >= 'A' && value <= 'F') return value - 'A' + 10;
else if (value >= 'a' && value <= 'f') return value - 'a' + 10;
assert(false);
}
#define BUFFER_SIZE (20)
int main(void)
{
char ackBuffer[BUFFER_SIZE] = "F12345890AB\r";
uint8_t result[(BUFFER_SIZE-2)/2]; // at most 9 bytes since it's 20 - 2 / 2
char* ptr = ackBuffer;
assert(*ptr == 'F');
++ptr;
int count = 0;
while(*ptr != '\r')
{
uint8_t value = charToHex(*ptr) << 4 | charToHex(*(ptr+1));
result[count++] = value;
ptr += 2;
}
int i;
for (i = 0; i < count; ++i)
printf("%x\n", result[i]);
return 0;
}
uint8\t charToHex(无符号字符值)
{
如果(value>='0'&&value='A'&&value='A'&&value='A'&&value>如何将字符串“04”
转换为整数0x04
?@OliCharlesworth一种老方法是scanf(%2.2x),&val)
.ackBuffer[0]='0';ackBuffer[16]=0;/*null terminate*/然后遵循@MadScienceDreams:在运行时成本低于开发时间的PC上就是这样做的。而不是在处理能力严重受限的微控制器上。@Zac:sscanf
绝对不是一个好的性能目标。strtol
将是库提供的最好的函数,但是它仍然比必要的更一般。@OliCharlesworth:我很无聊:(感谢mate的快速回答!我会尝试这么做。@BenVoigt:是的,这是一个拼写错误(代码中确实正确)。谢谢,刚刚修复了它。是的,它以'\r'结尾(回车,ASCII格式为13)而不是r。以前用过sscanf,但没有真正起作用。也尝试过一些困难的事情,但也没有达到我想要的效果。