Visual Basic, .NET, ASP, VBScript
 

   
   
     

Форум - Общий форум

Страница: 1 |

 

  Вопрос: Преобразование чисел из одной системы исчислен... Добавлено: 22.08.03 10:57  

Автор вопроса:  Paul

Добрый день!

Возникла задача преобразовать число из шестнадцатиричной системы в десятичную. VB6.0

Вся проблема в том, что число 7-ми байтное.

Ну, думаю, ладно, нет функций, работающих с 7 байтными числами, напишем свои...

Переведём &H21080300000001 - должны получить 9297483209375745

ну что-нибудь подобное...
Public Function fParceHexToDecimal(ByVal sHex As String) As Variant
    Dim i As Integer, iExp As Integer, lDec As Variant, iBase16 As Variant
    iBase16 = 16
    If Left(sHex, 2) = "&H" Then sHex = Mid(sHex, 3)
    iExp = Len(sHex)
    For i = 1 To Len(sHex)
        iExp = iExp - 1
        'MsgBox CDec(fHexToInt(Mid(sHex, i, 1))) & "*" & CDec(iBase16 ^ iExp) & "+" & lDec
        lDec = CDec(fHexToInt(Mid(sHex, i, 1))) * iBase16 ^ iExp + lDec
    Next
    fParceHexToDecimal = CDec(lDec)
End Function

Public Function fHexToInt(ByVal sChar As String) As String
    Select Case sChar
    Case "A"
        fHexToInt = "10"
    Case "B"
        fHexToInt = "11"
    Case "C"
        fHexToInt = "12"
    Case "D"
        fHexToInt = "13"
    Case "E"
        fHexToInt = "14"
    Case "F"
        fHexToInt = "15"
    Case Else
        fHexToInt = sChar
    End Select
End Function

Получаем 9297483209375753...

6-байтные переводит прекрасно,

но при возведении в степень iBase16 ^ iExp (16^13) получаем

неверное число 4503599627370500 вместо 4503599627370496.

Т.е. виновник -оператор ^.

Тип Variant хранит такие числа, но вот математические операции

видимо не работают правильно.

Или может я что-то упустил?

Что можно сделать?

( Замена a^13 на b^13*c^13 ничего не даёт)

Может есть API функции?

Ответить

  Ответы Всего ответов: 2  

Номер ответа: 1
Автор ответа:
 LamerOnLine



ICQ: 334781088 

Вопросов: 108
Ответов: 2822
 Профиль | | #1 Добавлено: 22.08.03 15:01

Вот этот код должен работать

Function HexToDec(sByte)

For Counter = 1 To Len(sByte)

Select Case Mid(sByte, Counter, 1)

Case "0"

HexToDec = HexToDec + 0 * (16 ^ (Len(sByte) - Counter))

Case "1"

HexToDec = HexToDec + 1 * (16 ^ (Len(sByte) - Counter))

Case "2"

HexToDec = HexToDec + 2 * (16 ^ (Len(sByte) - Counter))

Case "3"

HexToDec = HexToDec + 3 * (16 ^ (Len(sByte) - Counter))

Case "4"

HexToDec = HexToDec + 4 * (16 ^ (Len(sByte) - Counter))

Case "5"

HexToDec = HexToDec + 5 * (16 ^ (Len(sByte) - Counter))

Case "6"

HexToDec = HexToDec + 6 * (16 ^ (Len(sByte) - Counter))

Case "7"

HexToDec = HexToDec + 7 * (16 ^ (Len(sByte) - Counter))

Case "8"

HexToDec = HexToDec + 8 * (16 ^ (Len(sByte) - Counter))

Case "9"

HexToDec = HexToDec + 9 * (16 ^ (Len(sByte) - Counter))

Case "A"

HexToDec = HexToDec + 10 * (16 ^ (Len(sByte) - Counter))

Case "B"

HexToDec = HexToDec + 11 * (16 ^ (Len(sByte) - Counter))

Case "C"

HexToDec = HexToDec + 12 * (16 ^ (Len(sByte) - Counter))

Case "D"

HexToDec = HexToDec + 13 * (16 ^ (Len(sByte) - Counter))

Case "E"

HexToDec = HexToDec + 14 * (16 ^ (Len(sByte) - Counter))

Case "F"

HexToDec = HexToDec + 15 * (16 ^ (Len(sByte) - Counter))

End Select

Next

End Function

Ответить

Номер ответа: 2
Автор ответа:
 crackoff



ICQ: 156165990 

Вопросов: 12
Ответов: 229
 Профиль | | #2 Добавлено: 25.08.03 09:51

Или вот так

Function HexToBin(s As String) As Long
Dim cs As String, ko As Integer
    s = Trim(s)
    cs = "0123456789ABCDEF"
    Dim i As Integer, fk As Long
    For i = 0 To Len(s) - 1
        ko = InStr(1, cs, Mid(s, i + 1, 1)) - 1 'position
        If ko < 0 Then ko = 0
        fk = fk + ko * 16 ^ (Len(s) - i - 1)
    Next i
HexToBin = fk
End Function

Ответить

Страница: 1 |

Поиск по форуму



© Copyright 2002-2011 VBNet.RU | Пишите нам