none
16進制轉換10進制

    問題

  •  

    從設備抓下來的值為十六進位.要轉成十進位

    (426F 9BFD)16進制=(59.90233)十進制

    請問vb有沒有轉換方法

    2009年1月15日 上午 06:13

解答

  • 沒有現成的.就自己寫一個

    目前僅可算出16與32bit 浮點...64bit需要再做修改

    如果有更好的寫法或不同意見請賜教...

     

    Function Dec(n As String) As Double
         Dim i As Integer, sum As Double, dot As String, s As String, n1 As String
         For i = 1 To Len(n)
            Select Case Mid(n, i, 1)
                Case "0"
                    s = s + "0000"
                Case "1"
                    s = s + "0001"
                Case "2"
                    s = s + "0010"
                Case "3"
                    s = s + "0011"
                Case "4"
                    s = s + "0100"
                Case "5"
                    s = s + "0101"
                Case "6"
                    s = s + "0110"
                Case "7"
                    s = s + "0111"
                Case "8"
                    s = s + "1000"
                Case "9"
                    s = s + "1001"
                Case "A"
                    s = s + "1010"
                Case "B"
                    s = s + "1011"
                Case "C"
                    s = s + "1100"
                Case "D"
                    s = s + "1101"
                Case "E"
                    s = s + "1110"
                Case "F"
                    s = s + "1111"
            End Select
           
        Next i
        n = Mid(s, 2, 8)
        For i = Len(n) To 1 Step -1
                If (Mid(n, i, 1) = 1) Then
                    n1 = n1 + 2 ^ (Len(n) - i)
                End If
        Next i
       
        If n1 > 127 Then
            n = "1" + Mid(s, 10, n1 - 127)
            dot = Mid(s, 10 + n1 - 127 + 1, 31 + 127 - n1)
        End If

        For i = Len(n) To 1 Step -1
            sum = sum + Val(Mid(n, i, 1)) * 2 ^ (Len(n) - i)
        Next i
       
        For i = 1 To Len(dot)
            sum = sum + Val(Mid(dot, i, 1)) * 2 ^ (-i)
        Next i
        If Mid(s, 1, 1) = "1" Then n = "-1" Else n = "1"
        Dec = sum * n
    End Function

    2009年1月16日 上午 06:01

所有回覆

  • Try it:

     

    Code Snippet

    Convert.ToInt32("426F 9BFD", 16)

     

     

     

    2009年1月15日 上午 06:23
    版主
  • 可以透過下列程式碼作處理:

    CLng("&H122")

     
    其中122為要處理的16進位數字.
    2009年1月15日 上午 06:40
    版主
  •  

    Convert.ToInt32("426F 9BFD", 16)-->出現此處需要物件

     

    對了..我是在 VB 環境

     

    2009年1月15日 上午 08:46
  •  

    CLng("&H122")

     

    計算出來的值不正確

    這是一個32bit float

    沒辦法用一般的轉法..

    感謝你的回答.

    2009年1月15日 上午 08:49
  • 中間不能有空白。

     

    此外你應該要有變數來儲存傳回值吧?
    2009年1月15日 上午 08:50
  •  toney621 寫信:

     

    CLng("&H122")

     

    計算出來的值不正確

    這是一個32bit float

    沒辦法用一般的轉法..

    感謝你的回答.

     

    要轉啥型別應該要先講清楚,而不是網友回了才說,這樣浪費你的時間也浪費網友的時間。

     

    你要的東西可以看下面這兩個:

    函數 HexToObject 將16進位字串轉換為 .Net 數值變數型別
    函數 HexToVariant 將16進位字串轉換為 VB.NET 數值變數型別

    2009年1月15日 上午 08:54
  • 火氣別這麼大嗎

    32bit float 也是剛才在網路文章看到的.

    還有.我的環境是vb不是net

    所以沒有這兩個函數

     

    2009年1月15日 上午 09:04
  • 這是剛查查到的範例

    但看不懂...

    有興趣.就玩玩吧...有學過請您指導一下

     

    43A4C00016 = 0 10000111 010010011000000000000002
    實際指數 =偏移值- 127 = 135 -127 = 8
    假數部份 = 010010011
    所以為小數 =1.010010011
    實數為 1.010010011×28 = 101001001.12= 329.510
    2009年1月15日 上午 09:07
  • 你先看過本版公告:張貼文章應注意事項及應提供資訊

     

    你就不會先漏 single 再漏 vb6 。

     

    VB6:16進位轉變數

    程式碼在最上方的連結點進去。

     

    你最好先搞清楚位元組是Big Endian 還是 Little Endian。

     

    2009年1月15日 上午 10:56
  •  心冷熱情熄 寫信:

    你先看過本版公告:張貼文章應注意事項及應提供資訊

     

    你就不會先漏 single 再漏 vb6 。

     

    VB6:16進位轉變數

    程式碼在最上方的連結點進去。

     

    你最好先搞清楚位元組是Big Endian 還是 Little Endian。

     

     

    HexToVariant 出現編譯錯誤....是需要引用那個項目嗎?

     

    我的資料結構學的不好,不記得有學過Big Endian 還是 Little Endian

     

    2009年1月16日 上午 01:21
  • 沒有現成的.就自己寫一個

    目前僅可算出16與32bit 浮點...64bit需要再做修改

    如果有更好的寫法或不同意見請賜教...

     

    Function Dec(n As String) As Double
         Dim i As Integer, sum As Double, dot As String, s As String, n1 As String
         For i = 1 To Len(n)
            Select Case Mid(n, i, 1)
                Case "0"
                    s = s + "0000"
                Case "1"
                    s = s + "0001"
                Case "2"
                    s = s + "0010"
                Case "3"
                    s = s + "0011"
                Case "4"
                    s = s + "0100"
                Case "5"
                    s = s + "0101"
                Case "6"
                    s = s + "0110"
                Case "7"
                    s = s + "0111"
                Case "8"
                    s = s + "1000"
                Case "9"
                    s = s + "1001"
                Case "A"
                    s = s + "1010"
                Case "B"
                    s = s + "1011"
                Case "C"
                    s = s + "1100"
                Case "D"
                    s = s + "1101"
                Case "E"
                    s = s + "1110"
                Case "F"
                    s = s + "1111"
            End Select
           
        Next i
        n = Mid(s, 2, 8)
        For i = Len(n) To 1 Step -1
                If (Mid(n, i, 1) = 1) Then
                    n1 = n1 + 2 ^ (Len(n) - i)
                End If
        Next i
       
        If n1 > 127 Then
            n = "1" + Mid(s, 10, n1 - 127)
            dot = Mid(s, 10 + n1 - 127 + 1, 31 + 127 - n1)
        End If

        For i = Len(n) To 1 Step -1
            sum = sum + Val(Mid(n, i, 1)) * 2 ^ (Len(n) - i)
        Next i
       
        For i = 1 To Len(dot)
            sum = sum + Val(Mid(dot, i, 1)) * 2 ^ (-i)
        Next i
        If Mid(s, 1, 1) = "1" Then n = "-1" Else n = "1"
        Dec = sum * n
    End Function

    2009年1月16日 上午 06:01
  • 沒有現成的方法,要自行撰寫函數
    http://www.dotblogs.com.tw/yc421206/archive/2008/11/15/5992.aspx
    2009年2月9日 上午 10:01
  • 我想你回文前,看清楚前面的討論。

    這篇是討論到實數轉 16 進位,含浮點的位置,所以網址中只有整數的討論,是完全離題的。

    正確來說,這篇是討論變數在記憶體中的實值,類似遊戲大師之類的轉換。
    2009年2月9日 上午 11:55
  • 範例只是一種邏輯運算的說明,莫非浮點進制轉換與整數進制轉換運算,兩者大大不同??
    2009年2月9日 下午 02:16
  • 如果已確定其為Single
    可直接將資料填至變數之記憶體 再讀出即可

    先用vb將此數字寫到檔案
    Private Sub Command2_Click()
        Dim fp&, f!
        f! = 59.90233
        fp& = FreeFile()
        Open "c:\x.bin" For Binary As #fp
        Put #fp, , f!
        Close #fp
    End Sub
    再用DEBUG看 可得59.90233 = FC 9B 6F 42
    所以你的16進位字串要翻過來

    Debug.Print HexStr2Sng("426F", "9BFD")
    看看這樣有沒比你的方法快100倍

    Private Declare Sub CopyMemory Lib "kernel32.dll" Alias "RtlMoveMemory" (ByVal Destination As Long, ByVal Source As Long, ByVal Length As Long)
    Function HexStr2Sng(LowWord$, HighWord$) As Single
        Dim f!, StrHex&
        '
        StrHex& = CLng("&H" & LowWord$)
        CopyMemory VarPtr(f!) + 2, VarPtr(StrHex&), 2
        '
        StrHex& = CLng("&H" & HighWord$)
        CopyMemory VarPtr(f!), VarPtr(StrHex&), 2
        '
        HexStr2Sng = f!
    End Function

    2009年2月10日 上午 05:08
  • ...
    就是不同,不然直接用 Hex 函數就可以了。後面那篇也舉例了。

    VB6 用 CopyMemory ,VBNET 直接用 MemoryStream 即可,前面給的網址正是如此舉例。
    2009年2月10日 上午 06:32
  • Hex不能用在小數,所以不能用它,要自己寫演算副程式,
    小數跟整數要分開算,計概應該就有講到演算方式,
    我指的是演算方式大同小異,並非強調Hex函數。

    以下連結有範例
    http://zhidao.baidu.com/question/52398040.html


    2009年2月10日 下午 04:44