Страница: 1 |
Добрый день! Возникла задача преобразовать число из шестнадцатиричной системы в десятичную. VB6.0 Вся проблема в том, что число 7-ми байтное. Ну, думаю, ладно, нет функций, работающих с 7 байтными числами, напишем свои... Переведём &H21080300000001 - должны получить 9297483209375745 ну что-нибудь подобное... Public Function fHexToInt(ByVal sChar As String) As String Получаем 9297483209375753... 6-байтные переводит прекрасно, но при возведении в степень iBase16 ^ iExp (16^13) получаем неверное число 4503599627370500 вместо 4503599627370496. Т.е. виновник -оператор ^. Тип Variant хранит такие числа, но вот математические операции видимо не работают правильно. Или может я что-то упустил? Что можно сделать? ( Замена a^13 на b^13*c^13 ничего не даёт) Может есть API функции?
Вот этот код должен работать 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 Или вот так Function HexToBin(s As String) As Long Страница: 1 |
Вопрос: Преобразование чисел из одной системы исчислен...
Добавлено: 22.08.03 10:57
Автор вопроса: Paul
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
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
Ответы
Всего ответов: 2
Номер ответа: 1
Автор ответа:
LamerOnLine
ICQ: 334781088
Вопросов: 108
Ответов: 2822
Профиль | | #1
Добавлено: 22.08.03 15:01
Номер ответа: 2
Автор ответа:
crackoff
ICQ: 156165990
Вопросов: 12
Ответов: 229
Профиль | | #2
Добавлено: 25.08.03 09:51
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