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

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


Примеры работы со строковыми переменными

Поиск:
Перевод двоичного кода(типа String в байт).
Например "1010" в 10, "10000000" = 128...
Код
Option Explicit
Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (Destination As Any, Source As Any, ByVal Length As Long)

Private Sub Command1_Click()
  Dim sStr$
  sStr = InputBox("Input Byte", , "11111111")
  Me.Caption = "&H" + CStr(Hex(BinToByte(sStr)))
End Sub

Private Function BinToByte(ByVal sByte As String) As Byte
  Dim bByte(1 To 8) As Byte, i%
  CopyMemory bByte(1), ByVal sByte, 8
  For i = Len(sByte) To 1 Step -1
      BinToByte = BinToByte + IIf((bByte(i) And 1) = 0, 0, 2 ^ (Len(sByte) - i))
  Next
End Function

Автор ответа: Mephisto

Функцию BinToByte (см.выше) можно также написать немного подругому:
Код
Private Function BinToByte2(ByVal sByte As String) As Byte
Dim bByte(1 To 8) As Byte, i%
Dim bNByte As Byte
CopyMemory bByte(1), ByVal sByte, 8
If bByte(1) And 1 Then bNByte = bNByte Or 128
If bByte(2) And 1 Then bNByte = bNByte Or 64
If bByte(3) And 1 Then bNByte = bNByte Or 32
If bByte(4) And 1 Then bNByte = bNByte Or 16
If bByte(5) And 1 Then bNByte = bNByte Or 8
If bByte(6) And 1 Then bNByte = bNByte Or 4
If bByte(7) And 1 Then bNByte = bNByte Or 2
If bByte(8) And 1 Then bNByte = bNByte Or 1
BinToByte2 = bNByte
End Function

Ну а если мы еще хотим немного поизголяться :), то можно заменить в первом варианте функции BinToByte
2 ^ (Len(sByte) - i)) левым сдвигом. Вообще-то в VB нет левого сдвига поэтому придется написать его самому, на асм. Вот что в конце концов получится.
Код
Option Explicit

Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (Destination As Any, Source As Any, ByVal Length As Long)
Private Declare Function CallWindowProc Lib "user32" _
Alias "CallWindowProcA" (ByVal pLShiftCode As Long, _
                       ByVal value As Long, _
                       ByVal shift As Long, _
                       ByVal lp3 As Long, _
                       ByVal lp4 As Long) As Long

Dim LShiftCode() As Byte ' машинный код
Dim pLShiftCode As Long  ' указатель на машинный код

Private Sub Form_Load()
ReDim LShiftCode(22)
LShiftCode(0) = &H55
LShiftCode(1) = &H89
LShiftCode(2) = &HE5
LShiftCode(3) = &H57
LShiftCode(4) = &H8B
LShiftCode(5) = &H7D
LShiftCode(6) = &H8
LShiftCode(7) = &H8B
LShiftCode(8) = &H4D
LShiftCode(9) = &HC
LShiftCode(10) = &H8B
LShiftCode(11) = &H7
LShiftCode(12) = &HD3
LShiftCode(13) = &HE0
LShiftCode(14) = &H89
LShiftCode(15) = &H7
LShiftCode(16) = &H5F
LShiftCode(17) = &H89
LShiftCode(18) = &HEC
LShiftCode(19) = &H5D
LShiftCode(20) = &HC2
LShiftCode(21) = &H10
LShiftCode(22) = &H0

pLShiftCode = VarPtr(LShiftCode(0)) ' получаем указатель на машинный код
End Sub

Private Function LShift(ByRef value As Long, shift As Long)
  LShift = CallWindowProc(pLShiftCode, VarPtr(value), shift, 3&, 4&)
End Function

Private Sub Command1_Click()
 Dim sStr$
 sStr = InputBox("Input Byte", , "11111111")
 Me.Caption = "&H" + CStr(Hex(BinToByte(sStr)))
End Sub

Private Function BinToByte(ByVal sByte As String) As Byte
 Dim bByte(1 To 8) As Byte, i%
 CopyMemory bByte(1), ByVal sByte, 8
 For i = Len(sByte) To 1 Step -1
     BinToByte = BinToByte + IIf((bByte(i) And 1) = 0, 0, LShift(1, Len(sByte) - i))
 Next
End Function


Если нам нужно работать с большим количеством информации, то надо брать последний вариант, т.к. он самый эффективный.

Подробности о использовании ассемблера в VB написаны здесь:
VF-VB-002158

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

Как разобрать String на массив данных типа байт в формате ANSI:
Код
Option Explicit
Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (Destination As Any, Source As Any, ByVal Length As Long)

Private Sub Command1_Click()
  Dim sStr$, bData() As Byte, i%
  sStr = InputBox("Введите строку для разложения", , "Mephisto")
 
  StrToDim sStr, bData()
 
  Me.Caption = ""
  For i = 1 To Len(sStr)
      Print CStr(i) + "-" + CStr(bData(i)) + " " + Chr$(bData(i))
  Next
End Sub

Private Sub StrToDim(ByVal strSource As String, bDim() As Byte)
  ReDim bDim(1 To Len(strSource))
  CopyMemory bDim(1), ByVal strSource, Len(strSource)
End Sub

Автор ответа: Mephisto
Реальное отображение данных типа String в оперативной памяти. Формат Unicode:
Код
Option Explicit
Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (Destination As Any, Source As Any, ByVal Length As Long)

Private Sub Command1_Click()
  Dim sStr$, bData() As Byte, i%
  sStr = InputBox("Input String", , "Mephisto")
 
  StrToDimUnicode sStr, bData()
 
  Me.Caption = ""
  For i = 1 To LenB(sStr)
      Print CStr(i) + "-" + CStr(bData(i)) + " " + Chr$(bData(i))
  Next
End Sub

Private Sub StrToDimUnicode(ByVal strSource As String, bDim() As Byte)
  Dim BSTR As Long
  ReDim bDim(1 To LenB(strSource))
  BSTR = StrPtr(strSource)
  CopyMemory bDim(1), ByVal BSTR, LenB(strSource)
End Sub

Не дадим обмануть себя.

Автор ответа: Mephisto

Использование функций Len, Mid и Right:
Код
Private Function GetFileName(ByVal strFileName As String)
 Dim pOs%, i%
 For i = Len(strFileName) To 1 Step -1
     If Mid(strFileName, i, 1) = "\" Then
         pOs = i
         Exit For
     End If
 Next
 GetFileName = Right(strFileName, Len(strFileName) - pOs)
End Function

Автор ответа: Mephisto
Автор: cardinal, Mephisto






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

 

 

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


Популярные:
  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. Проверить дубляжи в столбце


 

 

 
 
На главную