У меня есть результат, управляемый библиотекой, который хранится в виде значения 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 и тому подобное, и кажется сумасшедшим, что так трудно преобразовать целое число в строку.
Указатель типа 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
,
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 бит, но это реализация, определенная, если она подписана или не подписана). Вы можете привести этот указатель кhar*
, хотя вам нужно указать компилятору, что вы хотите привести между указателями, используя reinterpret_cast:
char *secondValAsChar = reinterpret_cast<char*>(secondValPointer);
Теперь вы можете рассматривать этот указатель как указатель на символ. Например, следующий код напечатает «L», потому что ASCII-код для L равен 76:
std::cout << *secondValAsChar << std::endl;
Однако вы должны быть очень осторожны с этим указателем, поскольку secondValAsChar не является строкой с нулевым символом в конце, поэтому вы не можете использовать старые распространенные методы, такие как strcat
,