Преобразование строки в Char * и ее хеширование с использованием SHA-256 - PullRequest
0 голосов
/ 05 мая 2019

Я пытаюсь объединить текущий DateTime на мой Mac-адрес устройства в следующем формате: aa:bb:cc:dd:ee:ffYYmmDDhhMMss, чтобы я мог хэшировать его и отправлять в веб-службу каждый раз, когда собираю новые данные (поэтому я буду надо хешировать в каждом цикле)

Мне удалось объединить два значения (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*?

Обновление:

Мой код выглядит так:

  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* массив выводит так, мне все равно нужно его хешировать.

Спасибо, что помогли мне продвинуться так далеко, у меня все еще есть способы пойти

1 Ответ

1 голос
/ 05 мая 2019

Вы не выделяете место для хранения строки C, получаемой из addressDateTime.

hashThis - это char*, который является указателем на символ.Ничего не было установлено, так что это просто ... случайно.Что почти наверняка приведет к сбою вашей программы или, по крайней мере, к неправильному поведению.

Учитывая ваш код, самое быстрое решение - это изменить

    char* hashThis;

на

    char hasThis[30];
    addressDateTime.toCharArray(hashThis, 30);

Iизменено с 28 на 30, потому что aa:bb:cc:dd:ee:ffYYmmDDhhMMss на самом деле имеет длину 29 символов и также требует дополнительного байта для символа нулевого терминатора строки C.Я не уверен на 100%, если метод 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, а не длину строки в ней.

...