Преобразование байтового массива в число с плавающей точкой в ​​Lua [Структура данных с плавающей точкой] - PullRequest
0 голосов
/ 05 июля 2010

У меня есть возможность читать память с помощью Lua, но я столкнулся с проблемой. Я хочу прочитать значение с плавающей точкой.

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

Byte Array 65 B6 40 43 EC 35 87 41 51 04 9E 3F
Float Value 192.712478637695

Я знаю значение с плавающей запятой, потому что я использую редактор памяти. В Lua у меня есть функция, аналогичная memcpy, она называется readmem (Address, bytes) и возвращает целочисленное значение.

Как бы я прочитал байтовый массив в число с плавающей точкой в ​​Lua, используя readmem.

Ради этого вопроса, я полагаю, вы могли бы предположить, что 6 из 65 - это адрес 00000000.

Ответы [ 4 ]

4 голосов
/ 05 июля 2010

Странно, похоже, что оно хранится в порядке среднего порядка байтов.(Я проверил это с помощью http://www.h -schmidt.net / FloatApplet / IEEE754.html )

В любом случае, вы можете выполнить преобразование в чистом Lua, используя код из http://yueliang.luaforge.net/

См. Также http://lua -users.org / lists / lua-l / 2010-03 / msg00910.html

Если вы можете использовать C, попробуйте одну из перечисленных библиотекв http://lua -users.org / wiki / StructurePacking

3 голосов
/ 05 июля 2010

Это достаточный объем работы, чтобы все было правильно.Вам нужно будет извлечь показатель степени и значимое (значение и иногда называют мантиссой), преобразовать в число с плавающей запятой, используя math.frexp, а затем аннулировать результат, если установлен знаковый бит.Вам также придется распознавать денормализованные числа и NaN.(В нормализованном числе наиболее значимый бит значимого и неявного; в денормализованном числе это явный.) Если вам просто нужно сделать это самостоятельно, вам будет полезно прочитать статью Дейва Голдберга обо всем, что нужно ученому-информатикузнать о с плавающей точкой.Также имейте в виду, что число Lua является двойным IEEE, и будьте осторожны с точностью.

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

0 голосов
/ 06 июля 2017

string.pack

Передача 'f' в качестве первого параметра вернет 4-байтовую строку представления с одинарной точностью, а 'd' вернет 8-байтовую строку представления с двойной точностью. Вы даже можете объявить порядок байтов

0 голосов
/ 05 июля 2010

Вы должны написать функцию C, чтобы выполнить преобразование.У Луа нет приведений или чего-то подобного.

...