Как преобразовать байт * полезную нагрузку в int? - PullRequest
0 голосов
/ 18 марта 2019

Я программирую ESP8266 что-то на плате разработчика, используя Arduino.У меня есть значение, хранящееся в байтах * полезной нагрузки.Я хочу преобразовать это значение и сохранить его в переменной int.Я пробовал разные методы, но ни один из них не работает нормально.Кто-нибудь может предложить мне хороший метод?Спасибо !!

1 Ответ

0 голосов
/ 19 марта 2019

То, как вы это делаете, полностью зависит от того, как вы представляли значение, когда передавали его через MQTT.

Если вы передали его в двоичном формате - например, вы опубликовали целое число в виде серии байтов - тогда вы такженужно знать порядок байтов и количество байтов.Скорее всего, это наименее значимый байт первым (поэтому, если целое число в шестнадцатеричном формате было 0x1234, оно будет передаваться как два байта - 0x34, а затем 0x12) и 32 бита.

Если вы передаете двоичный файл между двумя одинаковымина компьютерах с аналогичным программным обеспечением, вероятно, у вас все будет в порядке (до тех пор, пока это не изменится), но если компьютеры отличаются или программное обеспечение отличается, вы имеете дело с представлениями целого числа, которые будут зависеть от используемой вами платформы.,Даже использование разных языков на двух концах может иметь значение - Python может представлять одно целое число, а C - другое, даже если они работают на идентичных процессорах.

Так что, если вы передаете в двоичном формате, вы должны действительно выбрать машину-независимое представление.

Если вы выполняете передачу в двоичном формате и не пытаетесь сделать машинно-независимое представление, код будет выглядеть примерно так:

byte *payload;
int payload_length;
int result;

if(payload_length < sizeof(int)) {
    HANDLE THIS ERROR
} else {
    result = *(int *)payload;
}

Это проверяет, чтобы убедиться, что естьдостаточно байтов для представления двоичного целого числа, а затем использует приведение для извлечения целого числа из полезной нагрузки.

Если вы передали в двоичном формате в машинно-независимом формате, вам нужно будет выполнить любое преобразование, необходимое дляархитектура приема.

Я не рекомендую передавать в двоичном формате, если вы не знаете, что делаете, и у вас есть для этого веские причины.Большинство приложений сегодня будут нормально передавать в виде текста - что можно сказать, это машинно-независимое представление.

Наиболее вероятной альтернативой передаче в двоичном виде является текст - который может быть машинно-независимым форматом.Если вы передаете целое число в виде текста, ваш код будет выглядеть примерно так:

byte *payload;
int payload_length;
char payload_string[payload_length + 1];
int result;

memcpy(payload_string, payload, payload_length);
payload_string[payload_length] = '\0';
result = atoi(payload_string);

Этот код использует временный буфер для копирования полезной нагрузки.Нам нужно обрабатывать полезную нагрузку как строку C, а строки C имеют дополнительный байт в конце - '\ 0' - который указывает конец строки.В полезной нагрузке для этого нет места, и индикатор конца строки может или не может быть отправлен как часть полезной нагрузки, поэтому мы гарантируем, что он есть, скопировав полезную нагрузку и добавив ее.

После этого просто позвонить atoi(), чтобы преобразовать строку в целое число.

...