gpt4 book ai didi

c++ - 在 C++ 中拆分字符串

转载 作者:搜寻专家 更新时间:2023-10-31 01:34:47 24 4
gpt4 key购买 nike

我想要的:

要解析一个 MAC 地址字符串并获得一个包含六个 uint8_t 值的数组,输入如 string str = "01:23:45:AB:CD:EF ";.

我尝试过的(但没有奏效):

sscanf(str.c_str(), "%x:%x:%x:%x:%x:%x", &mac[0], &mac[1], &mac[2], &mac[3], &mac[4], &mac[5]);

为什么它不起作用:我在 Arduino IDE 的帮助下为 ESP8266 Wi-Fi 模块编程。尽管 Arduino 板的官方内核支持 sscanf(),但 ESP8266 的内核不支持。 (The solution to the issue given on GitHub 不起作用,如 nicjohnston 所述。)

最不喜欢:

任何占用过多 RAM、CPU 周期或程序存储的东西。
还有一些东西使用或直接/间接取决于 sscanfsetjmplongjmp,(和其他几个)可能无法工作。

编辑:@m.s 的回答。下面是绝对正确的,但我在设计自己的代码(如下所示)后意识到这一点。

for(uint8_t i=0; i<5; i++)
mac[i]=strtol(Serial.readStringUntil(':').c_str(),NULL,16);
mac[6]=strtol(Serial.readStringUntil('\n').c_str(),NULL,16);

最佳答案

在您的特定用例中,您可以简单地遍历字符串并将十六进制子字符串转换为数字,如下所示:

  • 每个子字符串正好由两个十六进制字符组成;让子字符串由 XY
  • 表示
  • XY 要么在 [0-9] 内,要么在 [A-F] 内,其中 A 表示 10B表示11等(十进制)
  • 从 ASCII 值到其中一个字符的数字含义的转换取决于字符来自哪个字符集:

  • 如果一个字符c来自[0-9],它的十进制意义是c-'0',即减去偏移量以便应用以下映射 '0'=>0, '1' => 1, ...

  • 如果一个字符c来自[A-F],映射可以表示为c-'A'+10

  • 然后,每个子字符串 XY 的数字十进制值 v 计算如下:v=X*16 + Y

  • 子字符串由单个字符分隔(这里是 :,但这并不重要)

以下代码实现了这些想法:


#include <string>
#include <cstdlib>

std::uint8_t getNum(char hexChar)
{
if(hexChar >= '0' && hexChar <= '9')
{
return hexChar - '0';
}
return (hexChar-'A'+10);
}

int main()
{
std::uint8_t mac[6];
std::string str = "01:23:45:AB:CD:EF";

std::uint8_t j = 0;
for(std::uint8_t i = 0; i<6; ++i)
{
mac[i] = getNum(str[j])*16 + getNum(str[j+1]);
j+=3; // get to the next substring
}
}

关于c++ - 在 C++ 中拆分字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38673748/

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