Преобразование числа с плавающей запятой в шестнадцатеричное значение
Я пытаюсь преобразовать значение с плавающей запятой в 4-байтовое шестнадцатеричное значение.
Например, мой ввод: 58,5. Мой ожидаемый результат: 426A0000 или что-то вроде 0x42 0x6A 0x00 0x00.
Моя программа:
void setup() {
Serial.begin(9600);
float z = 128;
unsigned i;
unsigned char *chpt;
chpt = (unsigned char *)&z;
Serial.print("Float Value : ");
Serial.println(z);
Serial.print("4 Byte hexadecimal Value: ");
for (i = 0; i < sizeof(z); i++) {
Serial.print(chpt[i],HEX);
//Серийный.print(" ");
}
Serial.println();
}
void loop() {
}
Мой текущий вывод:
Плавающее значение: 128,00
4-байтовое шестнадцатеричное значение: 00043
@Josh Earnest, 👍0
1 ответ
▲ 1
Это значение кажется мне правильным. Он хранится с прямым порядком байтов в тысячах.
0x43000000 — фактическое значение.
Serial.print(x, HEX)
усекает ведущие нули. поэтому 00
получает 0
Таким образом, ваш вывод равен 0 0 0 43
, что соответствует представлению вышеприведенного с прямым порядком байтов.
Ознакомьтесь с представлением с плавающей запятой IEEE-754.
Также попробуйте онлайн FoatConverter.
Попробуйте следующее:
char floatString[9];
sprintf(floatString, "%02X%02X%02x%02x", chpt[3], chpt[2], chpt[1], chpt[0]);
floatString[8] = '\0';
Serial.print(floatString);
,
@Kwasmich
Смотрите также:
- Преобразовать string во float на ардуино
- Хранение значений широты и долготы в виде символов с заданной точностью
- Включить полную библиотеку snprintf() с плавающей точкой с помощью PlatformIO
- .toFloat() дает неправильные ответы
- Как разделить входящую строку?
- Как вывести несколько переменных в строке?
- Float печатается только 2 десятичных знака после запятой
- Отправка и получение различных типов данных через I2C в Arduino
Спасибо за ответ @kwasmich Если я ввожу значение с плавающей запятой, скажем, Float Value: 235,56, я получаю такие значения. 4-байтовое шестнадцатеричное значение: 5C8F6B43 Любые изменения в программе, которые вы хотели бы предложить, чтобы получить результат как 436B8F5C, @Josh Earnest
Я только что добавил пример кода, который должен дать вам то, что вы хотели в первую очередь., @Kwasmich
printf — мощный инструмент.
%02X
означает, что значение должно быть напечатано в шестнадцатеричном виде (x) с шириной не менее 2 знаков (2), дополненной нулями (0)., @KwasmichБольшое спасибо!!!!!!!!!!!!! Я могу получить свой результат. Но затем я вручную ввожу значения с плавающей запятой. Что я должен изменить в программе, чтобы вводить значение с плавающей запятой из последовательного монитора и получать вывод в последовательном мониторе?, @Josh Earnest
У меня нет готового решения для этого. Но шаги будут аналогичными, но в обратном порядке. Используйте
String string = Serial.readString();
, чтобы получить всю строку в одном блоке. Используйтеsscanf(string.c_str, "%02X%02X%02X%02X", &chpt[3], &chpt[2], &chpt[1], &chpt[0]);
для передачи прочитанных шестнадцатеричных значений в байт множество. Что-то вроде того., @KwasmichСпасибо мне помогло, @Josh Earnest
Пожалуйста. Подумайте о том, чтобы принять мой ответ как решение проблемы и сообщить другим, что ваш вопрос решен., @Kwasmich
Конечно ... !!! Это было решено, и это сработало очень хорошо, @Josh Earnest