Полезное для программистов:

Фриланс
Новости
Статьи
   
Рубрики:

Error. Page cannot be displayed. Please contact your service provider for more details. (26)


Dec, Bin и Hex - из одного представления в другое

Поиск:
Код

' Функция DecToBin описана ниже

Public Function DecToHex(DecVal As Double) As String
Dim a As Double, b As Double, c As String, d As Double
   a = DecVal
   For b = 1 To Int(Log(DecVal) / Log(16)) + 1
       d = CDbl(a Mod 16)
       Select Case d
           Case 0 To 9
               c = d
           Case Else
               c = Chr(55 + d)
       End Select
       DecToHex = c & DecToHex
       a = CDbl(Int(a / 16))
   Next b
End Function

Public Function BinToDec(Bin As String) As Double
Dim TotalDec As Double, a As Double
   For a = 1 To Len(Bin)
       TotalDec = (TotalDec * 2) + Mid(Bin, a, 1)
   Next a
   BinToDec = TotalDec
End Function

Public Function BinToHex(Bin As String) As String
   BinToHex = DecToHex(BinToDec(Bin))
End Function

Public Function HexToDec(HexVal As String) As Double
Dim TotalDec As Double, a As Double, c As Double
   For a = 1 To Len(HexVal)
       Select Case (Mid(HexVal, a, 1))
           Case 0 To 9
               c = (Mid(HexVal, a, 1))
           Case Else
               c = (Asc(Mid(HexVal, a, 1)) - 55)
       End Select
       TotalDec = (TotalDec * 16) + c
   Next a
   HexToDec = TotalDec
End Function

Public Function HexToBin(HexVal As String) As String
   HexToBin = DecToBin(HexToDec(HexVal))
End Function

Автор ответа: max12
Ответ взят на: www.vbfrance.com

Функция DecToBin была вычеркнута из кода, который написан выше функцию из-за ее громоздкости. Вот реализация функции DecToBin, которую предложил Akina:
Код
Public Function DecToBin(ByVal DecVal As Double) As String

   DecToBin = ""
   
   While DecVal > 0
       DecToBin = CStr(DecVal Mod 2) & DecToBin
       DecVal = DecVal \ 2
   Wend
   
   If Len(DecToBin) = 0 Then DecToBin = "0"

End Function

Также Akina предложил другой вариант функции HexToDec. Назовем эту функцию HexToDec2 и сравним оба варианта.
Код
Public Function HexToDec2(HexVal As String) As Double
HexToDec2 = Val("&H" & Trim(HexVal))
End Function

Разницу легко понять посмотрев на следующий код:
Код
Private Sub Command1_Click()
Dim x As Double
x = HexToDec("FFFFFFFFFFFFFFFF") ' что-то похожее на 18446744073709551615
x = HexToDec2("FFFFFFFFFFFFFFFF") ' ошибка 6, Overflow

x = HexToDec("7FFF")  ' = 32767
x = HexToDec("8000")  ' = 32768
x = HexToDec("8001")  ' = 32769

x = HexToDec2("7FFF") ' =   32767
x = HexToDec2("8000") ' = - 32768
x = HexToDec2("8001") ' = - 32767
End Sub

Конечно функция HexToDec2 работает быстрее HexToDec, но она имеет свои минусы. Или плюсы. :) Это смотря как посмотреть.
Автор ответа: cardinal, Akina

Когда-то, у меня была такая проблема, и я пользовался ф-ией Val. Но в какой-то момент я заметил что она возвращает отрицательные числа. Немного посоображав я понял, что VB по умолчанию пытается определить тип числового значения. Сначала он считает, что число byte, потом integer со знаком, потом long со знаком и т.д. Короче, если к HEX значению добавить амперсанд, который будет говорить что число является Long'ом, то все получится, в пределах 4 байтового значения со знаком.
Код
HexToDec2 = Val("&H" & Trim(HexVal) & "&")

теперь можно выводить числа в диапазоне:
0 - 7FFFFFFF положительные числа от 0 до 2'147'483'647
FFFFFFFF - 80000000 отрицательные от -1 до -2147483648

а вот таким образом:
Код
Public Function HexToDec3(HexVal As String) As Double
HexToDec3 = Val("&H" & Trim(HexVal) & "&") 'знак & говорит что число Long
HexToDec3 = IIf(HexToDec3 >= 0, HexToDec3, 4294967296# + HexToDec3)
End Function

выводятся только положительные числа в диапазоне от 0 до 4294967295, то есть 4х байтовые. При попытке написать HEX более 4х байт, будет выводиться или 0 или 4294967295, при попытке написать более 8 байт - ошибка переполнения.

вот вариант для подсчета 8 байтовых значений:
Код
Public Function HexToDec3(HexVal As String) As Double
HexToDec3 = Val("&H" & Trim(HexVal) & "#") ' # - Double
HexToDec3 = IIf(HexToDec3 >= 0, HexToDec3, 4294967296# + HexToDec3)
End Function

таким образом будут выводиться числа от 0 до 9,22337203685478E+18 (0 - 7FFFFFFFFFFFFFFF), при бОльших значениях, отрицательные и не правильно посчитанные Т.е. годна только для значений 0 - 7FFFFFFFFFFFFFFF

можно конечно по аналогии сделать и до положительных чисел (8 байт FF), но это уже никому не нужно...

Вот, исходя из моего опыта....

Автор ответа: -Mikle-
Автор: cardinal






Просмотров: 6548

 

 

Новые статьи:


Популярные:
  1. Как сделать цикличным проигрывание MIDI-файла?
  2. Создание AVI файла из рисунков
  3. Как устройство "отключить в данной конфигурации"?
  4. Kто в данный момент присоединен через Сеть?
  5. Как узнать количество доступной памяти?
  6. Как реализовать в RichEdit разноцветный текст?
  7. Как скрыть свое приложение от ProcessViewer
  8. Как программно нажать/скрыть/показ кнопку "Start"?
  9. Модуль работы с ресурсами в PE файлах
10. Функции вызова диалоговых окон выбора
11. Проверка граматики средствами Word'а из Delphi.
12. Модуль для упрощенного вызова сообщений
13. Функции для записи и чтение своих данных в, ЕХЕ- файле
14. Рекурсивный просмотр директорий
15. Network Traffic Monitor
16. Разные модули
17. Универсальная функция для обращения к любым экспортируем функциям DLL
18. Библиотека от VladS
19. Протектор для UPX'а
20. Еще об ICQ, сообщения по контакт листу?
21. Использование открытых интерфейсов
22. Теория и практика использования RTTI
23. Работа с TApplication
24. Примеры использования Drag and Drop для различных визуальных компонентов
25. Что такое порт? Правила для работы с портами
26. Симфония на клавиатуре
27. Загрузка DLL
28. Исправление автоинкремента
29. Взаимодействие с чужими окнами
30. Проверить дубляжи в столбце


 

 

 
 
На главную