Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > VB6 > HEX - to - String... DEC.... и т.п.


Автор: starley440 26.10.2004, 10:00
Есть ли команда для перевода типа данных из HEX в любой другой?
Суть проблемы:
В БД есть столбец с номерами изделий (8-9 знаков)
Номер представляет из себя 3 байта. Последние 2 байта - номер, который напечатан на изделии, а первый байт - номер "зоны" изделия (нигде не напечатан).
Таким образом:
Номер изделия, предположим 10141085
Номер зоны: 154. Номер, который напечатан на изделии: 48541.
---------------------------------------------------------------------------------------
Решение:
1) Номер изделия 10141085 переводим в HEX, получим 9ABD9D
Number=10141085
NumHEX=Hex(Number)
получаем 9ABD9D

2) Делим полученный номер на две части (Зона и номер):
NumZONE=MID(NumHEX,1,2) получаем 9А
NumPPRINT=MID(NumHEX,3,4)
получаем BD9D

И вот тут я попал! Мне никак не перевести номер из HEX в Integer :stena
например:
NumZONEint=Cint(NumZONE) smile=594
Стандартные функции, типа Cint, Cdec... и т.п. не подходят. Везде выдает ошибку типов...
Мне ещё надо поиск по напечатанному на изделии номеру нашаманить.
Перебором ~400К номеров перебирать в цикле - не выход. Должно-же быть что-то стандартное.
Заранее спасибо.

Автор: Akina 26.10.2004, 10:24
NumZONEint=Cint("&H" & NumZONE)

Автор: starley440 26.10.2004, 10:44
Огромное спасибо... только вот интересная штЮка...
при номере изделия Number=8369786 получаем NumPrint=-16207 а правильно 49329

Ээээээ..... получается, что-то я упустил и возвращается не верный ответ... Отрицательных вариантов не может быть
Кстати, в калькуляторе всё получается ОК... ;-)

Автор: boevik 26.10.2004, 10:56
Объяви NumZONEint как Long и всё будет OK.

Автор: starley440 26.10.2004, 11:08
Абсолютно не ожидал...
Перевёл в текст CStr и всё получилось...
Только с Лонгом... без объявления вообще ерунда получается :)

спасибо

Автор: stasic0640 7.11.2006, 10:11
Парни, извените за поднятие темы, но интересует как сделать (чтот башня совсем не варит smile ):

- из НЕХ в DEC:  smile 

Пример: ХЕКС(16символов) - 9B51385F285B1256, что по идее должно получится DEC (20 символов) - 11191788530342498902





С ув. stasic0640

Удачи всем... smile 

Автор: Akina 7.11.2006, 10:42
Работа со сверхдлинными числами не поддерживается штатными средствами. Ищи внешние библиотеки или создавай свои.

Автор: stasic0640 7.11.2006, 12:19
 smile Ох обрадовали... smile 

Автор: Akina 7.11.2006, 12:32
Ой, да ладно... уж перевод из гексов в десятичку запрограммить - делов на 10 минут.

Автор: JUmPER 7.11.2006, 15:13
вот =)
Код

Private Function Ceil(num As Double) As Long
    Ceil = Int(num)
    If (num - Ceil <> 0) Then
        Ceil = Ceil + 1
    End If
End Function

Private Function Normalize(ByRef aDigits() As Long) As Long
    Dim i As Long
    Dim highest_digit As Long

    For i = 0 To UBound(aDigits)
        If (aDigits(i) > 0) Then
            highest_digit = i
            If (aDigits(i) > 9) Then
                aDigits(i + 1) = aDigits(i + 1) + aDigits(i) \ 10
                aDigits(i) = aDigits(i) Mod 10
            End If
        End If
    Next

    Normalize = highest_digit
End Function

Public Function HexToDec(aHex As String) As String
    If (aHex = "") Then
        HexToDec = ""
        Exit Function
    End If

    Dim chars As String
    Dim result As String
    Dim i As Long
    Dim j As Long
    Dim digits() As Long
    Dim src_digits() As Long
    Dim highest_digit As Long

    chars = "123456789ABCDEF"

    ReDim src_digits(Len(aHex) - 1)
    For i = 0 To Len(aHex) - 1
        src_digits(i) = CLng(InStr(chars, Mid(aHex, Len(aHex) - i, 1)))
    Next

    highest_digit = 0

    ' 1.4 - статистическая величина (объяснить не могу, т.к. сам в непонятках)
    ReDim digits(Ceil(Len(aHex) * 1.4) - 1)
    For i = UBound(src_digits) To 0 Step -1
        digits(0) = digits(0) + src_digits(i)

        If (i <> 0) Then
            For j = 0 To highest_digit
                digits(j) = digits(j) * 16
            Next
        End If

        highest_digit = Normalize(digits)
    Next

    result = ""

    For i = 0 To highest_digit
        result = Trim(Str(digits(i))) & result
    Next

    HexToDec = result
End Function


Добавлено @ 15:14 
Akina
у меня заняло поболее smile 

Автор: stasic0640 7.11.2006, 15:17
smile С мя пиффо...  smile

Добавлено @ 15:24 
 smile С мя пиффо...  smile 


Благодарен smile 

Прошу в гости...  smile 
г. Днепр, СЦ Akey

Автор: Akina 7.11.2006, 17:12
Цитата(JUmPER @  7.11.2006,  16:13 Найти цитируемый пост)
' 1.4 - статистическая величина (объяснить не могу, т.к. сам в непонятках)

должно быть

Код

MaxLen(Dec) = lg(16) * (1 + Len(Hex))


Добавлено @ 17:12 
Цитата(JUmPER @  7.11.2006,  16:13 Найти цитируемый пост)
у меня заняло поболее

Ты обрабатывал краевые и ненормальность

Автор: JUmPER 8.11.2006, 09:12
Akina
 smile точно, а я тут голову ломал... smile 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)