Преобразование двоичного числа в шестнадцатеричное

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
Gigahard
Бывалый
Бывалый
 
Сообщения: 253
Зарегистрирован: 24.07.2002 (Ср) 11:15
Откуда: Russia

Преобразование двоичного числа в шестнадцатеричное

Сообщение Gigahard » 30.01.2006 (Пн) 17:29

Собственно есть ли в VB функция преобразования двоичного формата в шестнадцатеричный?
Старый глюк лучше новых двух!

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 30.01.2006 (Пн) 17:31

Преобразуй сам, по матрице (из 16 элементов). Это будет куда быстрее вычислений.
Lasciate ogni speranza, voi ch'entrate.

Konst_One
Член-корреспондент академии VBStreets
Член-корреспондент академии VBStreets
Аватара пользователя
 
Сообщения: 3041
Зарегистрирован: 09.04.2004 (Пт) 13:47
Откуда: Химки

Сообщение Konst_One » 30.01.2006 (Пн) 17:40

Код: Выделить всё
Public Function Bin2Hex(ByVal sBin As String) As String
    Dim i As Integer
    Dim nDec As Long
    sBin = String(4 - Len(sBin) Mod 4, "0") & sBin 'Add zero to complete Byte


    For i = 1 To Len(sBin)
        nDec = nDec + CInt(Mid(sBin, Len(sBin) - i + 1, 1)) * 2 ^ (i - 1)
    Next i
    Bin2Hex = Hex(nDec)
    If Len(Bin2Hex) Mod 2 = 1 Then Bin2Hex = "0" & Bin2Hex
End Function


тебе это что ли надо :?:

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 30.01.2006 (Пн) 17:48

Я бы по другому сделал.
Код: Выделить всё
Option Explicit
...
Private BinDict As Collection
...
Function Bin2Hex(BinValue As String) As String
  If BinDict Is Nothing Then
    Set BinDict = New Collection
    BinDict.Add Key:="0000", Item:="0"
    BinDict.Add Key:="0001", Item:="1"
    BinDict.Add Key:="0010", Item:="2"
    BinDict.Add Key:="0011", Item:="3"
    ...
    BinDict.Add Key:="1110", Item:="E"
    BinDict.Add Key:="1111", Item:="F"
  End If
Dim I As Long, V As String, res As String
I = Len(BinValue)
res = Space$(Fix(I/4) + I Mod 4, " ")
For I = 1 To Len(res)
  V = Mid$(BinValue, Len(BinValue) - I * 4 + 1, 4)
  On Error Resume Next
  V = BinDict.Item(V)
  If Err.Number > 0 Then V = "-"
  On Error Goto 0
  Mid$(res, I, 1) = V
Next I
End Function


З.Ы. Это эскиз, не код.
Lasciate ogni speranza, voi ch'entrate.

Andrey Fedorov
Член-корреспондент академии VBStreets
Член-корреспондент академии VBStreets
 
Сообщения: 3287
Зарегистрирован: 21.05.2004 (Пт) 9:28
Откуда: Москва

Сообщение Andrey Fedorov » 31.01.2006 (Вт) 11:03

alibek писал(а):Я бы по другому сделал.


А я бы еще по другому - вот сейчас набросал - см ниже.
Приведенная функция преобразует строку с двоичным представлением числа любой длины в его шестнадцатеричное представление:

Код: Выделить всё

Public Function BinToHex(ByVal sBin As String) As String
    Dim i As Long, k As Long, h As Integer, ss As String
   
    k = Len(sBin)
    If k = 0 Then Exit Function
    k = k Mod 4
    If k Then sBin = String$(4 - k, "0") & sBin
    BinToHex = String$(Len(sBin) \ 4, "0")
   
    For k = 1 To Len(sBin) Step 4
        ss = Mid$(sBin, k, 4): h = 0
        For i = 1 To 4
            If Mid$(ss, i, 1) = "1" Then h = h + 2 ^ (4 - i)
        Next i
        If h Then Mid$(BinToHex, (k + 3) \ 4, 1) = Hex$(h)
    Next k
End Function
Фиг Вам! - Сказал Чебурашка, обгладывая Крокодила Гену...

Gigahard
Бывалый
Бывалый
 
Сообщения: 253
Зарегистрирован: 24.07.2002 (Ср) 11:15
Откуда: Russia

Сообщение Gigahard » 31.01.2006 (Вт) 11:31

Круто! Спасибо! То что нужно :).
Конечно не хотелось бы наглеть :oops: ... Но можно еще примерчик аналогичной функции, только с обратным преобразованием? Т.е. HexToBin...
Старый глюк лучше новых двух!

Andrey Fedorov
Член-корреспондент академии VBStreets
Член-корреспондент академии VBStreets
 
Сообщения: 3287
Зарегистрирован: 21.05.2004 (Пт) 9:28
Откуда: Москва

Сообщение Andrey Fedorov » 31.01.2006 (Вт) 11:37

Gigahard писал(а):Круто! Спасибо! То что нужно :).
Конечно не хотелось бы наглеть :oops: ... Но можно еще примерчик аналогичной функции, только с обратным преобразованием? Т.е. HexToBin...


Не - тут сам подумай. Неинтересно уже...
Фиг Вам! - Сказал Чебурашка, обгладывая Крокодила Гену...

Matew
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 894
Зарегистрирован: 28.06.2004 (Пн) 17:44
Откуда: Дальний Восток, г. Ха

Сообщение Matew » 31.01.2006 (Вт) 11:45

Алкоголь и сканеры-ваши враги! Не верите-смотрите аватару :-)

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 31.01.2006 (Вт) 12:06

Andrey Fedorov писал(а):А я бы еще по другому - вот сейчас набросал - см ниже.
Приведенная функция преобразует строку с двоичным представлением числа любой длины в его шестнадцатеричное представление:

Если пару строчек добавить (дополнение нулями до длины, кратной 4), то у меня тоже будет произвольная длина. Но вот скорость работы наверняка будет выше.
Lasciate ogni speranza, voi ch'entrate.

Andrey Fedorov
Член-корреспондент академии VBStreets
Член-корреспондент академии VBStreets
 
Сообщения: 3287
Зарегистрирован: 21.05.2004 (Пт) 9:28
Откуда: Москва

Сообщение Andrey Fedorov » 31.01.2006 (Вт) 12:08

alibek писал(а):Если пару строчек добавить (дополнение нулями до длины, кратной 4), то у меня тоже будет произвольная длина. Но вот скорость работы наверняка будет выше.


А померить? Коллекции ведь довольно медленно работают.
На большой строке твоя функция должна заметно проиграть...
Фиг Вам! - Сказал Чебурашка, обгладывая Крокодила Гену...

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 31.01.2006 (Вт) 12:37

Мерять лень :)
Но коллекция создается и заполняется только один раз за все время работы программы, а поиск в коллекции по ключу работает быстро.
Lasciate ogni speranza, voi ch'entrate.

Andrey Fedorov
Член-корреспондент академии VBStreets
Член-корреспондент академии VBStreets
 
Сообщения: 3287
Зарегистрирован: 21.05.2004 (Пт) 9:28
Откуда: Москва

Сообщение Andrey Fedorov » 31.01.2006 (Вт) 12:42

alibek писал(а):Мерять лень :)


А ты только код своей функции пофиксь окончательно, а я померю...

alibek писал(а):Но коллекция создается и заполняется только один раз за все время работы программы, а поиск в коллекции по ключу работает быстро.


В большой коллекции поиск работает довольно-таки медленно.
У тебя, правда, маленькая коллекция, но накладные расходы на нее все одно думаю перевесят...
Фиг Вам! - Сказал Чебурашка, обгладывая Крокодила Гену...


Вернуться в Visual Basic 1–6

Кто сейчас на конференции

Сейчас этот форум просматривают: Google-бот и гости: 158

    TopList  
cron