我正在尝试将当前DateTime
连接到我的设备Mac地址,格式如下:aa:bb:cc:dd:ee:ffYYmmDDhhMMss
,以便我可以对其进行哈希处理,并在每次收集新数据时将其发送到Web服务(所以我必须在每个循环中对其进行哈希处理)
我设法将两个值(mac地址+日期时间)串联起来,并将其转换为char
数组
addressDateTime.toCharArray(thisThing, 28);
但是,我对如何继续感到迷茫。
我还尝试以此周期读取结果char*
,但我不明白为什么它不起作用:
void loop() {
while (!timeClient.update()) {
timeClient.forceUpdate();
}
String addressDateTime = getPayload(); //this gets the *aa:bb:cc:dd:ee:ffYYmmDDhhMMss* string
char* hashThis;
addressDateTime.toCharArray(hashThis, 28);
for (int i = 0; i < sizeof(hashThis); i++) {
char str[3];
sprintf(str, "%02x", hashThis[i]);
Serial.print(str);
}
delay(5000);
}
我可以正确地将String
转换为char*
吗?
我应该如何去哈希char*
?
或者我可以不将字符串转换为char*
而散列吗?
我的代码看起来像这样的atm
while (!timeClient.update()) {
timeClient.forceUpdate();
}
String addressDateTime = getPayload();
char hashThis[30];
addressDateTime.toCharArray(hashThis, 30);
for (int i = 0; i < sizeof(hashThis); i++) {
Serial.printf("%02x", hashThis[i]);
}
delay(5000);
}
因此我设法将String
转换为Char*
,除了输出看起来像这样33433a37313a42463a31443a34323a463431393035303531343038323700
而不是aa:bb:cc:dd:ee:ff190505141037
弄清楚为什么我的char*
数组输出为什么仍然需要对其进行哈希处理。
感谢您帮助我走了这么远,我还有路要走
答案 0 :(得分:1)
您没有分配空间来存储从addressDateTime
获取的C字符串。
hashThis
是char*
,它是指向字符的指针。它尚未设置为任何东西,因此只是...随机。几乎可以肯定,这会使您的程序崩溃或至少行为不当。
给出您的代码,最快的解决方法就是更改
char* hashThis;
到
char hasThis[30];
addressDateTime.toCharArray(hashThis, 30);
我将28更改为30,因为aa:bb:cc:dd:ee:ffYYmmDDhhMMss
实际上是29个字符长,并且C字符串空终止符也需要一个额外的字节。我不确定toCharArray()
方法是否设置了空终止符;如果没有,则需要添加
hasThis[29] = '\0';
您可以通过仅使用String c_str()
方法来避免这种情况,该方法将char*
返回到String用于保存字符串的内部缓冲区。
在这种情况下,您可以重写
char* hashThis;
addressDateTime.toCharArray(hashThis, 28);
为
char* hashThis = addressDateTime.c_str();
顺便说一句,你也可以做
Serial.printf("%02x", hashThis[i]);
,省去snprintf()
。不过,在此获得正确的缓冲区大小也很荣幸!
更新
在更新的问题中,您说过希望看到的输出如下:
aa:bb:cc:dd:ee:ff190505141037
代替:
33433a37313a42463a31443a34323a463431393035303531343038323700
您的代码是
for (int i = 0; i < sizeof(hashThis); i++) {
Serial.printf("%02x", hashThis[i]);
}
您将每个字符写为两位数的十六进制数字,因此您将看到代表该字符的十六进制数字,而不是字符本身。如果要查看字符,请执行以下操作:
for (int i = 0; i < strlen(hashThis); i++) {
Serial.printf("%c", hashThis[i]);
}
或(更好)
for (int i = 0; i < strlen(hashThis); i++) {
Serial.print(hashThis[i]);
}
或(最佳)
Serial.println(hashThis);
请注意,我已将您的sizeof
更改为strlen
。如果出于某种原因在hashThis
中放入了较短的字符串,则strlen
将做正确的事情,而sizeof
将始终返回声明hashThis
的长度,而不是长度其中的字符串。