Преобразование числа с плавающей запятой в шестнадцатеричное значение

Я пытаюсь преобразовать значение с плавающей запятой в 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

, 👍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 Если я ввожу значение с плавающей запятой, скажем, 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