2010-07-05 32 views
0

我有能力用Lua讀取內存,但遇到了問題。 我想讀取一個浮點值。在Lua中將字節數組轉換爲浮點數[Float Data Structure]

我有,我認爲是一個浮動,在內存中看起來像這樣。

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

我知道float值,因爲我使用的是內存編輯器。 在Lua中我有一個類似於memcpy的函數,它叫做readmem(Address,bytes)它返回一個整數值。

我該如何將字節數組讀取到使用readmem的Lua中的float中。

對於這個問題的緣故,我想你可以假設,在65 6的地址00000000

回答

0

您必須編寫C函數來完成轉換。 Lua沒有演員或類似的東西。

+0

我相信你可以完成任務而不用在C中添加一個函數來轉換它,儘管我意識到這是簡單的出路。我敢肯定,如果我更好地理解float數據結構如何工作,我可以形成一個字符串,然後將其轉換爲Lua中的float。 由於我有能力直接讀取內存,我真的沒有看到什麼阻止我將一個浮動補丁一起。 這是一個懶惰的答案我不能投票下來,因爲我的代表不夠高。 – Nowayz 2010-07-05 09:53:04

+0

@Nowayz:理論上,這是可能的。但是,實際上,你會對浮點數據結構做出許多假設。另外,你只能將它轉換爲一個數字,這是一個雙精度值,而不是浮點數。另外,你的字節數組不是一個浮點數。浮點數是32位或4字節。你有12個字節。這只是你想要做的錯誤的一個例子。如果你有C中的地址,那麼你可以執行一個指針轉換來獲得原始表示,但它仍然是錯誤的。 – Puppy 2010-07-05 10:04:48

3

這是相當數量的工作,使一切正確。 您需要提取指數和有效位(有效位有時稱爲尾數),使用math.frexp轉換爲浮點數,然後在符號位置1時否定結果。你還必須認識非規範化的數字和NaN。 (在規範化的數字中,有效數字的最重要的位是隱式的;在非規格化的數字中是明確的)。 如果你自己必須自己做這個,你會發現閱讀Dave Goldberg關於計算機科學家需要的一切的文章很有幫助瞭解浮點數。 也請記住,一個Lua數是一個IEEE雙精度值,並要注意精度。

如果我自己這樣做,我不會經歷所有這些痛苦—而不是我想寫C代碼來讀取字節並呼籲lua_pushnumber

0

string.pack

傳遞'f'作爲第一個參數將返回單精度表示的4字節串,而'd'將返回雙精度表示的8字節串。你甚至可以聲明float的字節順序