Заморочка с массивом.

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
Andrey A Kireev
Обычный пользователь
Обычный пользователь
 
Сообщения: 51
Зарегистрирован: 06.11.2003 (Чт) 10:05

Заморочка с массивом.

Сообщение Andrey A Kireev » 14.10.2004 (Чт) 11:25

Имеем такой алгоритм шифрования.
Код: Выделить всё
For position = 1 To FileSize
  Letter = Hex(Buff(position))
  If Len(Letter) = 1 Then Letter = &O0 & Letter
  a$ = Left(Letter, 1)
  b$ = Right(Letter, 1)
  Letter = b$ & a$
  LetterB = Asc(Letter)
  Buff(position) = LetterB
Next position


В массиве Buff() мы имеем открытый файл он As Byte, тоесть масив байтов.
Первой строкой получается Стринговое значение элемента массива, к примеру 4D
Потом проверяется и коректируется эта литера по принципу 0=00.
Дальше расчленяется эта это значение отдельно на 4 и D.
И сшивается в перевернутое значение D4.
Следом Стринговое значение переводится в Asc тоесть обратно в Байтовое значение.
Ну и потом в Buff() заносится переделаное таким способом значение.

Но тут проблема, в результате в буфере одни цифры.
Я пробовал вместо Asc ставить Chr не прокатывает, ругается на несовместимость переменных.

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

Сообщение alibek » 14.10.2004 (Чт) 13:00

Val("&h" & "4D")
Lasciate ogni speranza, voi ch'entrate.

Andrey A Kireev
Обычный пользователь
Обычный пользователь
 
Сообщения: 51
Зарегистрирован: 06.11.2003 (Чт) 10:05

Сообщение Andrey A Kireev » 14.10.2004 (Чт) 13:42

Огромное спасибо.
Сработало как нужно. :)

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Re: Заморочка с массивом.

Сообщение tyomitch » 15.10.2004 (Пт) 8:24

Andrey A Kireev писал(а):Имеем такой алгоритм шифрования.
Код: Выделить всё
For position = 1 To FileSize
  Letter = Hex(Buff(position))
  If Len(Letter) = 1 Then Letter = &O0 & Letter
  a$ = Left(Letter, 1)
  b$ = Right(Letter, 1)
  Letter = b$ & a$
  LetterB = Asc(Letter)
  Buff(position) = LetterB
Next position

Его можно существенно соптимизировать, отказавшись от строковых переменных вовсе:
Код: Выделить всё
For position = 1 To FileSize
  b = Buff(position)
  Buff(position) = 16 * (b Mod 16) + (b \ 16)
Next position

Сравни скорость ;-)
Изображение

Andrey A Kireev
Обычный пользователь
Обычный пользователь
 
Сообщения: 51
Зарегистрирован: 06.11.2003 (Чт) 10:05

Сообщение Andrey A Kireev » 15.10.2004 (Пт) 12:41

Стринговые переменные нужны, ибо помимо этого они будут замещаться другими по шаблону прямо в этом цикле.
Это только часть алгоритма.

У меня тут еще одна заморочка возникла.
Нужно обьявить массив с уже указаными элементами.
Тоесть массив Code() должен содержать значения Стринговые 0,1,2,3,4,5,6,7,8,9,A,B,C,D,E,F разложеными по отдельным ячейкам, а не иметь в одной ячейке всю строку 0123456789ABCDEF.
Если масив заранее указывается как Byte то удается эти символы уложить по отдельным ячейкам, но они туда укладываются как HEX значения без первого нуля и при обращении к такому массиву вылазиет этот лишний 0 который не нужен.
Нужное мне получилось если в массив этот набор символов загружать из файла, но это мне ненужно.
Вот на таком примере это получилось:
Код: Выделить всё
Dim Position As Long
  Dim fs As Long
  Dim Buff() As Byte
  Open "c:\code.txt" For Binary As #1
  fs = LOF(1)
  ReDim Buff(1 To fs)
  Get #1, , Buff()
  Close #1
  ' а вот это не получается 
  ' Buff() = "0","1","2","3","4","5","6","7","8","9","A","B","C","D","E","F"
 
  For Position = 1 To 16
    Print Chr(Buff(Position))
    ' здесь отображается что именно легло в буфер
  Next Position

Andrey A Kireev
Обычный пользователь
Обычный пользователь
 
Сообщения: 51
Зарегистрирован: 06.11.2003 (Чт) 10:05

Сообщение Andrey A Kireev » 15.10.2004 (Пт) 13:00

Получилось еще так:
Код: Выделить всё
Dim Position As Long
  Dim fs As Long
  Dim Buff() As Byte
  Buff() = "0123456789ABCDEF"
 
  For Position = 2 To 31 Step 2
    Print Chr(Buff(Position))
  Next Position


Но не нравится что приходится прыгать через ячейку.

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 15.10.2004 (Пт) 13:09

buff=strconv("0123456789ABCDEF", vbfromunicode)
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

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

Сообщение alibek » 15.10.2004 (Пт) 13:16

Используй StrConv
Lasciate ogni speranza, voi ch'entrate.

Andrey A Kireev
Обычный пользователь
Обычный пользователь
 
Сообщения: 51
Зарегистрирован: 06.11.2003 (Чт) 10:05

Сообщение Andrey A Kireev » 15.10.2004 (Пт) 13:19

Buff() = StrConv("0123456789ABCDEF", vbFromUnicode)
Вот этого я не знал.
Огромное спасибо всем откликнувшимся. :)


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

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

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

    TopList