Большое число в переменную

Вероятно, что-то простое, но я не решил.

Я извлекаю данные из строки JSON, и все значения верны для двух.

Они относятся к двум значениям даты и времени в миллисекундах.

Один – дата обновления, второй – дата обновления.

Проблема в том, что они оба очень большие, и мне трудно назначить их в IDE.

Одним из них является 1588447162117, который отображается как 020-05-02 20:19:53.948 на панели инструментов с использованием JSON.

Вот код, который у меня есть для получения данных из JSON:

#include <ArduinoJson.h>

void setup() {
  Serial.begin(4800);

  const char* input = "{TotalCases:3308678,TotalCasesToday:4458,TotalDeaths:234123,TotalDeathsToday:293,TotalRecovered:1042991,TotalTerritories:124,CurrentUpdatedMS:1588312648603,CurrentChangedMS:1588312648603}";

  StaticJsonDocument<512> doc;

  DeserializationError err = deserializeJson(doc, input);

  if (err) {
    Serial.print("Error: ");
    Serial.println(err.c_str());
    return;
  }

  unsigned long TotalCases = doc["TotalCases"];
  unsigned long TotalCasesToday = doc["TotalCasesToday"];
  unsigned long TotalDeaths = doc["TotalDeaths"];
  unsigned long TotalDeathsToday = doc["TotalDeathsToday"];
  unsigned long TotalRecovered = doc["TotalRecovered"];
  unsigned long TotalTerritories = doc["TotalTerritories"];
  unsigned long CurrentUpdatedMS = doc["CurrentUpdatedMS"];
  unsigned long CurrentChangedMS = doc["CurrentChangedMS"];

  Serial.print("Total Cases: ");
  Serial.println(TotalCases);
  Serial.print("Total Cases Today: ");
  Serial.println(TotalCasesToday);
  Serial.print("Total Deaths: ");
  Serial.println(TotalDeaths);
  Serial.print("Total Deaths Today: ");
  Serial.println(TotalDeathsToday);
  Serial.print("Total Recovered: ");
  Serial.println(TotalRecovered);
  Serial.print("Total Territories: ");
  Serial.println(TotalTerritories);
  Serial.print("Update time in ms:");
  Serial.println(CurrentUpdatedMS);
  Serial.print("Change time in ms:");
  Serial.print(CurrentChangedMS);
}

void loop()
{

}

**Serial monitor output**

Total Cases: 3308678
Total Cases Today: 4458
Total Deaths: 234123
Total Deaths Today: 293
Total Recovered: 1042991
Total Territories: 124
Update time in ms:0
Change time in ms:0

Должно быть хорошо манипулировать им, как только я смогу работать с ним в переменной.

Спасибо за любой вклад,

Шейн

, 👍1

Обсуждение

в чем именно ваш вопрос?, @jsotola

Я думаю, вы хотите использовать uint64_t, но в зависимости от вашего оборудования это может быть невозможно., @Codebreaker007

Какую библиотеку JSON вы используете? Как вы закодировали чтение значения? Обратите внимание, что это число составляет примерно 2 ^ 40,53, поэтому оно не умещается в 32 бита. Но это произойдет, если вы отбросите последние 3 цифры, что уменьшит разрешение до одной секунды., @Edgar Bonet

Пожалуйста, покажите свой код, @chrisl

это число шестнадцатеричное 171D6D42F05... оно умещается в 64 бита, @jsotola

Разве это не длинные 32 бита на большинстве Arduinos? Какие платы Arduino поддерживают 64-битные целые числа?, @Duncan C

Любой. Дело не в плате. Это зависит от компилятора. Правление определяет, насколько *эффективно* оно их обрабатывает. Любая плата может использовать uint64_t., @Majenko

Честная оценка. Раньше я писал код 6502, где все, что превышает 8 бит, требовало ручного переноса и тому подобное. Современный компилятор позаботится об этом за вас за счет снижения производительности., @Duncan C

JSON слишком сложен для встроенных целей по сравнению с гораздо более полезной C++ struct. Почему вы используете JSON вместо чего-то вроде структуры?, @P_B


1 ответ


1

Я не пробовал сам, но, просто просмотрев документы, я предлагаю вам попробовать:

  1. Добавление
#define ARDUINOJSON_USE_LONG_LONG 1

вверху скетча, перед включением ArduinoJson.h.

  1. Объявите CurrentUpdatedMS и CurrentUpdatedMS как unsigned long long или uint64_t.

ОБНОВЛЕНО: Чтобы ответить на вопрос в комментарии:

Когда вы сказали, что просматривали документы, где вы это проверяли?

Мне пришлось следовать (не очень простому) пути: руководство по десериализацииJsonDocument::operator[]JsonVariantJsonVariant::as<T>(). На этой последней странице указано, что метод as<unsigned long long>() «может потребоваться ARDUINOJSON_USE_LONG_LONG». К сожалению, макрос не связан, поэтому я должен искать его и найдено ARDUINOJSON_USE_LONG_LONG.

,

Спасибо, теперь у меня все работает, и я обработаю это так. Когда вы сказали, что просматривали документы, где вы проверяли? Просто чтобы знать, куда смотреть в будущем., @Lifesigns

Привет. Это сработало хорошо, поскольку я мог присвоить значение, хотя это временная метка UNIX, которая не отображается правильно при печати или отображении на OLED. Пробовал пару вещей, чтобы исправить это, включая приведение к long, u_int 64 и т. д., но все равно возвращает неправильное время. Мои данные обновлены в MS как 13 цифр, тогда как я должен быть в состоянии обработать 10. Буду признателен за любые мысли, которые я пробовал различные варианты. Есть ли способ преобразовать этот объект в JSON в строку?, @Lifesigns