gpt4 book ai didi

c++ - 十六进制字符数组 2 x 2 个字符到 uint8_t

转载 作者:行者123 更新时间:2023-11-30 19:47:43 26 4
gpt4 key购买 nike

我正在为微 Controller (mbed LPC1768) 编写一个程序,并且在解码 uint8_t 的串行输入时遇到一些问题。

我得到一个char ackBuffer[20];充满了来自外部设备的输入。我们得到的是例如:F040A34B6785121\r

我想要做的是获取一个 uint8_t 数组,其中每个数字都由 2 个字符的十六进制值表示。 F 表示来自外部设备的消息开始,回车是每条消息的结束。

所以我想要的 uint8_t 数组是:

0x04
0x0A
0x34
...

为了让事情变得更加困难,ackBuffer 的大小可能更小,因此仅举个例子 F04004A\r (如果这个问题很容易解决,那就太好了,但我可以自己解决这个问题。

谢谢!

最佳答案

所以我假设 ackMessage 必须以 'F' 开头并以 '\r' 结尾。我什至假设,由于您在微 Controller 上工作,因此应该避免任何超出要求的操作(例如库函数)。鉴于您只需迭代缓冲区:

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;
}

请注意,您必须拥有与所使用的编码一致的 charToHex,并且可能您可能需要对代码进行更多健全性检查。

关于c++ - 十六进制字符数组 2 x 2 个字符到 uint8_t,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20709795/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com