任何請幫我找出從8字節值計算經緯度的算法嗎?計算經緯度
8字節的值 - A027AFDF5D984840和它的經度是49.1903648
8字節的值 - 3AC7253383DD4B40和它的緯度是55.7305664
此外,如果可能的話,請告訴我如何計算浮點數值0000000000805A40 as 106.0
任何請幫我找出從8字節值計算經緯度的算法嗎?計算經緯度
8字節的值 - A027AFDF5D984840和它的經度是49.1903648
8字節的值 - 3AC7253383DD4B40和它的緯度是55.7305664
此外,如果可能的話,請告訴我如何計算浮點數值0000000000805A40 as 106.0
這不是特定於經度和緯度的計算。鑑於在您的示例中有8個字節可用,因此您要做的是將字節數組轉換爲雙精度浮點值。這三個例子的過程都是一樣的。
要找到浮點值,需要在位級別處理字節數組。該過程的解釋是here。或退房Wikipedia。
爲了讓你開始,在你的第一個例子中,你將處理40,48,98和5D等等的字節。分解前兩個字節40和48(0100 0000 0100 1000),可以獲得足夠的信息來獲取符號位(0)和指數位範圍(100 0000 0100 - > 1028)。從這裏繼續列出剩下的52位來確定數字的小數部分。如果您按照上述鏈接進行計算,您將會看到您期望的示例中的浮點值。
作爲一個側面說明,一些編程語言提供了一種爲您做這種轉換的方法。根據您使用的語言,這裏不需要重新發明輪子。
編輯:實施例
的字節數組轉換爲雙精度浮點值,我們將需要從字節數組的信息的三個部分組成:符號位(S),所述指數(E)和分數(F)。首先要做的是創建8字節數組的64位表示。正如我上面提到的,你將使用「反向」順序的字節(小尾數,如果你想讀的話題)。我將只使用前四個字節,因爲它們足以說明該過程。
40 48 98 5D ==> 01000000 01001000 10011000 01011101
我將把比特以上中0是最左邊的順序。
符號位: 這是上面數組中的第0位。在這種情況下,S爲0.符號位正是您想象的那樣,它確定浮點結果是否爲負值或正值。
指數: 位1-11確定指數。在該示例中,指數E是1000000 0100 ==> 1028。
分數: 其餘的比特,12-63確定分數。我只說明了位12-31以顯示過程如何工作:1000 10011000 01011101 ....
小數位不會轉換爲十進制值。相反,你需要遍歷它們,注意設置的位(1,而不是0)。這些位的索引是重要的。考慮分數位開始索引1從左至右(位12-63)增加至20。再次,在完整的例子,這個索引將是1至52。
的級分是通過對每個I」發現用這個表達式設置的第2位:2^-i。對於這個例子,這意味着我們正在處理索引1,5,8,9,14,16,17,18,20。
前四個索引將爲我們提供足夠精度爲示例的目的:
˚F =(2^-1)+(2^-5)+(2^-8)+( 2^-9)+ ... = 0.5 + 0.03125 + 0.00390625 + 0.001953125 = 0.537109375
最終值V通過應用下面的公式找到:
V = -1^S * 2 ^(E-1023)*(1 + F)= - 1^0 + 2 ^(1028-1023)* 1.537109375 = 49.1875
這是您的目標值49.1903648的近似值。如果您要繼續以我向您展示的方式使用完整的小數位範圍,您的最終值將匹配。
最後,既然您提到您使用的是Java,請問您是否使用了ByteBuffer
類和getDouble
函數here?
感謝Adam的幫助。我正在嘗試在JAVA中。根據你的建議,我試圖找出做這種轉換的方法,但我沒有發現任何有用的東西。此外,由於我是新手,以低級別的位操作,我沒有得到上述鏈接中提供的轉換方法。您能否爲任何一個價值解釋轉換?謝謝,
Sachin Deshmukh – user1151896 2012-01-17 14:18:32
亞當非常感謝你的工作.......好的論壇 – user1151896 2012-01-18 11:49:54
好。在以後的文章中,您可能需要爲您的問題分配更多標籤以幫助他們獲得關注。 – 2012-01-18 22:14:56