Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > VB6 > Как преобразовать 16-ное выражение в 10-е ?


Автор: XPurple 31.5.2006, 08:00
Не могу найти, как называется функция , которая преобразует 16-тиричное число к 10-му виду 

Автор: BUGOR 31.5.2006, 08:50
MsgBox Val("&H" & "ABCDEF" & "&") 

Автор: vbCrLf 31.5.2006, 09:25
Сорри за оффтоп, но я посмеялся когда читал название темы...
Как преобразовать шестнадцатое выражение в десятое
Блин, народ, выражайтесь яснее!! Я может с мобилы сижу и трачу драгоценный траффик на темы, название которых вводит в заблуждение!  

Автор: XPurple 31.5.2006, 09:41
vbCrLf, 
Заголовок короткий
 

Автор: Akina 31.5.2006, 10:45
vbCrLf, 
Цитата(XPurple @  31.5.2006,  09:00 Найти цитируемый пост)
16-ное 

никак не разворачивается в шестнадцатое  

Автор: XPurple 31.5.2006, 10:50
Не получается отследить валидность вводимого текста ввиде код-H или код-в-десятичной-форме.

Задумка такая, чтобы вырезать в тексте любой символ включая спецсимволы.
Причем видимый символ вырезается путем ввода символа, например 'A', а для спецсимволов предназначен ввод в виде 'ASCIIКод-символ H' или в виде 'число', обозначающее ASCII-код этого символа.
Т.е. перевод каретки 0D будет вводиться в виде '0DH' или 'dh' или в числовом виде '13'.
Так вот проблема такая, что при попытке ввода текста в виде '12H', 'A' , '1H', '123' - все нормально, при вводе текста ввиде 'GH' или 'ААА' - type mismatch.
Подскажите, как проконтролировать валидность вводимых значений для функций Int и для преобразования 16-го числа в целочисленный вид ?

Вот код программы

Код

Option Explicit

Dim lnFrom%, lnTo%
Dim i As Integer
Dim FileSource, FileDest As String
Dim Retval, msg
Dim Symbol As String
Dim AsciiCodeSymbol As Integer
Dim SymbolIsValid As Boolean
Dim fso As Object



Private Sub Command1_Click()

FileDest = "file_out.bin"
Set fso = CreateObject("Scripting.FileSystemObject")

If fso.FileExists(FileDest) Then
fso.DeleteFile (FileDest)
Else
End If

Select Case Len(Symbol)
Case 1
AsciiCodeSymbol = Asc(Symbol)
SymbolIsValid = True

Case 2 To 3
'Место, где не получается
    If Right(Symbol, 1) = "H" Or Right(Symbol, 1) = "h" Then
     AsciiCodeSymbol = Val("&H" & Symbol & "&")
    Else
     AsciiCodeSymbol = Int(Symbol)
    End If
SymbolIsValid = True

Case Else
msg = MsgBox("Ошибка:" & Chr(32) & "Указано неверное значение вырезаемого символа" & vbCrLf & _
"Указано больше знаков", _
vbExclamation, "Окно состояния")
SymbolIsValid = False
End Select

If SymbolIsValid Then
Retval = Cut_Symbols(FileSource, FileDest, AsciiCodeSymbol)
Else
End If

End Sub

Private Sub Command2_Click()
End
End Sub

Private Sub Dir1_Change()
File1.Path = Dir1.Path
End Sub

Private Sub Dir1_Click()
Dir1.Path = Dir1.List(Dir1.ListIndex)
File1.Path = Dir1.Path
End Sub

Private Sub File1_Click()
FileSource = File1.FileName
End Sub

Public Function Cut_Symbols(ByVal FileFrom As String, ByVal FileTo As String, ByVal SymbolCut As Integer)

lnFrom = FreeFile
On Error GoTo label

Open FileFrom For Binary As #lnFrom
lnTo = FreeFile
Open FileTo For Binary As #lnTo

    'копирование содержимого
    ReDim Buffer(1 To LOF(lnFrom)) As Byte
    For i = 1 To LOF(lnFrom)
    'Get #lnFrom, , Buffer()  ' читаем полностью
    Get #lnFrom, , Buffer(i)
    
    'If Buffer(i) <> CByte(13) Then
    If Buffer(i) <> CByte(SymbolCut) Then
    Put #lnTo, , Buffer(i)
    Else
    End If
    Next
  
Close #lnFrom
Close #lnTo

label:
If Err.Number <> 0 Then
msg = MsgBox("Ошибка открытия " & Err.Number, vbExclamation, "Окно состояния")
Else
msg = MsgBox("Символ" & Chr(32) & "[" & Chr(SymbolCut) & "]" & Chr(32) & "вырезан по всему файлу" & Chr(32) & _
FileFrom & Chr(32) & "успешно." & vbCrLf & "Результат сохранен в файле" & Chr(32) & FileTo, _
vbInformation, "Окно состояния")
End If

End Function

Private Sub Form_Load()
Text1.Text = "A"
End Sub

Private Sub Text1_Change()
Symbol = Text1.Text

End Sub

  

Автор: Naghual 31.5.2006, 13:11
а как отличить "А" от "АА"?
Что из этого строка а что представление числа?
Алгоритм не ясен - как же объяснить его компьютеру? 

Автор: XPurple 31.5.2006, 14:03
Алгоритм прост, как яйцо:
Если вводится один символ, то подразумевается, что это видимый символ,т.е.  если введен символ A , то считается, что вводится символ 'A' или (chr(65), чтобы было понятней) , если вводится просто 1 - означает число или символ 1 (chr(49) )т.д. 
Если вводится 2 или 3 символа, то вводимое значение определяется либо как decimal Ascii code [10-254], либо как Hex Ascii code, тогда последним вводимым символом будет символ "h" или "H" и полная вводимая строка будет выглядеть либо как '1h' либо '23h', что будет означать '0x1' или '0x23'.
Где-то так. 

Автор: Akina 31.5.2006, 14:32
Цитата(XPurple @  31.5.2006,  11:50 Найти цитируемый пост)
как проконтролировать валидность вводимых значений для функций Int и для преобразования 16-го числа в целочисленный вид ?

Валидным полагается считать любую введенную последовательность символов, которая после удаления пробельных символов в начале и конце состоит только из символов, соответствующих шестнадцатиричным цифрам ([0-9][A-F][a-f]), возможно с одним из префиксов 0x (C-синтаксис), &H (Basic-синтаксис), $ или $H (Pascal-синтаксис), либо с суффиксом H (ASM-синтаксис). Возможны также шаблоны, соответствующие другим языкам.

Проверить на соответствие шаблону несложно. При соответствии отрезать префиск-суффикс, довесить Basic-овское &H и использовать CLng - по-моему несложно... 

Так4 в чем собсно проблема? 

Автор: BUGOR 31.5.2006, 16:09
Чё-т я тоже нихрена не понял, я же дал тебе вначале функцию для преобразования HexToDec, что ещё?smile Я\Вообще код какой-то сумбурный честно говоря, а правильность ввода данных(когда количество инвариантов большое и структура образца не совсем проста) давно пора привыкнуть проверять с помощью регулярных выражений. 

Автор: XPurple 1.6.2006, 05:47
BUGOR, 
Код как код, ничего сумбурного в нем не вижу. Наоборот упростил интерфейс до минимума, сведя все к 1-ой форме.
Насчет регулярных выражений -надо попробовать. Синтаксис для VB такой же ,что и везде?
Для работы с регулярными выражениями требуется подключать дополнительные References?

Цитата(Akina @  31.5.2006,  14:32 Найти цитируемый пост)
Так4 в чем собсно проблема?  

Проблема одна- пробелы в знаниях функций и методов. Спасибо за пинок в нужном направлении, стало намного понятней.
  

Автор: BUGOR 1.6.2006, 09:45
Нужно подключить класс:

Project > References > MS VB Regular Expressions

Пример использования поищи на форуме или в сети.

Вот составил выражение, учитывает все условия, которые тебе нужны:

^(0x|\$|\$H|&H)?[0-9A-Fa-f]+(H|h)?$

 

Автор: XPurple 1.6.2006, 11:46
BUGOR, 
Благодарю за разъяснения. Сам бы я долго разбирался. 

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