2009/05/07

VB6 二進位資料 轉 數值

VB6 二進位資料 轉 數值
當我們有二進位資料 如 &H3483126f
如何才能轉成 2.44141e-7 數值
使用 CopyMemory 函數 參考如下

範例:

Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (hpvDest As Any, hpvSource As Any, ByVal cbCopy As Long)

Dim lVar As Long
Dim iLoop As Integer
Dim bArray(1 To 4) As Byte

lVar = &H40030201

CopyMemory bArray(1), lVar, 4
For iLoop = 1 To 4
   If bArray(iLoop) And &HF0 Then
      Debug.Print Hex$(bArray(iLoop));
   Else
      Debug.Print "0" & Hex$(bArray(iLoop));
   End If
Next

這段程式把 lVar 的值原封不動地複製到 bArray 之中,由於 lVar 的大小為 4 個位元組,因此我們設定 bArray 的元素個數為 4 個。Array 在下下期電子期將會被介紹到,在這�暫時只要知道數字陣列的元素在記憶體中是連續的就好了。用白話來解釋 CopyMemory bArray(1), lVar, 4 這行程式碼是:
將由 lVar 變數起始的 4 個位元組複製到由 bArray(1) 起始 4 位元組大小的位元區塊。

由 lVar = &H40030201 我們知道了 lVar 的內容。最後一部分的 For…Next 是將 bArray 中複製的內容印在即時視窗中以便與 lVar 的內容對照。如果您把程式放到 VB 中執行,您將會得到結果:01020340!

咦?lVar 的內容為 40030201 呀,怎麼我們得到 01020340 呢?這到底是怎麼一回事?

這個問題牽涉到電腦二進位資料儲存的順序,叫做 Little Endian。簡單的說 little endian 是指資料儲存時的順序將是低順位的位元儲存在較低位址的記憶體中,當 CPU 由記憶體中讀取資料時,由較低的位址開始讀起。因此在上例中當 lVar 引數傳 CopyMemory 中時,所傳入的記憶體位址是位元值 01 的最低順位位元,之後由低往高讀上去,所以在 bArray 中的元素值才會是顛倒的。

參考處:
http://tlcheng.twbbs.org/Paper/Variant/Variant.htm

http://mychannel.pchome.com.tw/channel/class/show_preview.php3/?d=2002-07-18&enname=winapi4vber&t=.htm&fn=main&view=1