我会将myString“100.200.300.400”转换为字节数组[4]。 我是一个“有点”困惑,这是对的还是我需要使用foreach来读取一个数字?
android:cursorVisible="false"
android:focusableInTouchMode="false"
android:focusable="false"
android:selectAllOnFocus="false"
android:longClickable="false"
android:textIsSelectable="false"
最后我想将数组打印到串口。这应该是正确的。
String myString = "100.200.300.400";
byte myByteArray[4];
myString.getBytes(myByteArray,4);
我错了吗?我得到了49,48,48,0!
答案 0 :(得分:6)
如果您尝试从像"100.150.200.250"
这样的字符串到{ 100, 150, 200, 250 }
之类的字节数组,则需要提取每个数字的字符串表示形式,然后将它们转换(解析)为二进制表示形式将它们存储在字节数组中。
您尝试这样做的方式,只是将字符串中的前四个字节(即"100."
)转换为每个字符的二进制表示形式,结果为{ 49, 48, 48, 0 }
。您可以在ASCII table中查找。
还要记住,当您将其存储在字节数组中时,它只支持0到255之间的值。
当您在小型微控制器上编程时,我建议不要使用String
类。当程序变大并开始使用大量字符串时,您可能会遇到麻烦。尝试学习如何使用字符数组,避免遇到内存问题。请记住,Arduino只有2KB的RAM!
以下是一个可以使用strtoul()
函数进行转换的函数:
void parseBytes(const char* str, char sep, byte* bytes, int maxBytes, int base) {
for (int i = 0; i < maxBytes; i++) {
bytes[i] = strtoul(str, NULL, base); // Convert byte
str = strchr(str, sep); // Find next separator
if (str == NULL || *str == '\0') {
break; // No more separators, exit
}
str++; // Point to next character after separator
}
}
然后你可以像这样调用它来转换IP地址(基数为10):
const char* ipStr = "50.100.150.200";
byte ip[4];
parseBytes(ipStr, '.', ip, 4, 10);
或者像这样转换MAC地址(基数为16):
const char* macStr = "90-A2-AF-DA-14-11";
byte mac[6];
parseBytes(macStr, '-', mac, 6, 16);
答案 1 :(得分:2)
您还可以使用sscanf
,然后使用its return value检测无效输入:
byte ip[4];
if (sscanf(mString.c_str(), "%hhu.%hhu.%hhu.%hhu", ip, ip+1, ip+2, ip+3) != 4) {
Serial.print("invalid IP: ");
Serial.println(mString);
}
但是,sscanf
可能未在所有主板的库中实现,例如在版本2.4.0中的esp8266 yet to be released上。
此外,某些版本可能不支持%hhu
的{{1}}说明符,但您可以使用unsigned char
,将其读取到%u
并检查值是否并不大于255。