Приведение int16_t к uint_8t * - PullRequest
0 голосов
/ 12 декабря 2018

У меня есть результат, управляемый библиотекой, который хранится в виде значения int16_t (и оно является отрицательным, и я могу использовать его как абсолютное значение), а другая библиотечная функция требует этого значения несколькими шагами позже в форме uin8_t *.Как это можно сделать без использования String?

Следующий код работает, но использует страшные строки.Есть ли способ сделать это без вызова String или std :: string?

 void setup() {
      Serial.begin(9600);
    }

    void loop() {
      delay(5000);
      String initialVal= String(-fetchInt()); 
      Serial.print("Initial value is: ");Serial.println(initialVal);//prints "76"
      uint8_t medianVal[sizeof(initialVal);
      medianVal.getBytes(medianVal, sizeof(initialVal));
      Serial.print("median value is: ");Serial.println(medianVal);//prints "76"
      uint8_t* finalVal = medianVal;
      Serial.print("final value is: ");Serial.println((char*)finalVal);//prints "76"
      }

    int16_t fetchInt(){
      return -76;
    }

Итак, как мне превратить int16_t в uint8_t *?

В комментариях ниже было указано, что Serial.println(static_cast<unsigned>(*finalVal)); работает, но это решение преобразует uint8_t в unsigned int, а метод требует uint8_t *.

Я пришел из Java и т.п.и кажется сумасшедшим, что так трудно преобразовать целое число в строку.

Ответы [ 2 ]

0 голосов
/ 12 декабря 2018

int16_t сохраняет числовое значение со знаком, используя 16 бит (от -32 768 до 32 767).

uint8_t сохраняет числовое значение без знака, используя 8 бит (от 0 до 255).

Если вы уверены, что ваше значение int16_t вписывается в uint8_t после изменения знака, вы можете просто присвоить его:

int16_t firstVal = -76;
uint8_t secondVal = -firstVal;

Теперь, если вам нужен указатель на второе значение, вы можете простосоздать это.Вы не можете указать прямо на firstVal, потому что вам нужно сохранить измененное значение.

uint8_t* secondValPointer = &secondVal;

Этот uint8_t* может интерпретироваться как указатель на символ в вашей библиотеке.Обычно для этой цели следует использовать символ (также 8 бит, но это реализация, определенная, если она подписана или без знака ).Вы можете привести этот указатель к c har*, хотя вам нужно указать компилятору, что вы хотите привести между указателями, используя reinterpret_cast:

char *secondValAsChar = reinterpret_cast<char*>(secondValPointer);

Теперь вы можете рассматривать этот указатель как указатель на символ.Например, следующий код выведет «L», потому что ASCII-код для L - 76:

std::cout << *secondValAsChar << std::endl;

Однако вы должны быть очень осторожны с этим указателем, поскольку secondValAsChar не является строкой с нулевым символом в конце, поэтому вы не можетеиспользуйте старые распространенные методы, такие как strcat.

0 голосов
/ 12 декабря 2018

Указатель типа uint8_t не может указывать на объект типа int16_t;вам нужно скопировать значение firstVal, но для этого вам понадобится отдельный объект.

uint8_t firstValAbs = firstVal >= 0 ? firstVal : -firstVal;
uint8_t* secondVal = &firstValAbs;

Примечание: uint8_t x = -34 будет , а не даст вам абсолютное значение -34, то есть оно не приведет к 34.Вы получите двойное дополнение -34, то есть 255-34+1 == 222.

...