Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Microsoft Office и VBA программирование > Microsoft Office Excel
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 28.03.2015, 19:23   #1
freeaccess1
 
Регистрация: 28.03.2015
Сообщений: 4
По умолчанию Проблема со пецсимволами при шифровании

Всем привет!

У меня есть задача - реализовать в Excel
алгоритмы кодирования текста и его расшифровки.

Т.к. у меня в этом вопросе ограничений не было, я решил выполнить эту задачу следующим образом:
1. Составить алфавит символов
2. Назначить каждому сиволу псевдослучайное число
3. Отсортировать таблицу по случ.числам (перемешать алфавит)
4. Составить таблицы из исходного алфавита и перемешанного
(получим ключ шифрования)
5. Затем я написал в виде функций (пришлось столкнуться с VBA) алгоритмы кодирования и декодирования строк на основе полученного ключа.

Но я выявил две проблемы:
1. Цифры и некоторые спец.символы не обрабатываются в принципе - это скорее всего связано с тем, что в VBA необходимо как-то обрабатывать спец. символы и цифры.
2. Часть спец.символов при декодировании не показывают первоначальный текст. Я думаю, что причина тоже кроется в необходимости "обвертки" этих спец.символов для дальнейшей работы с ними.

Файл с моим результатом во вложении.

Хелп, у кого есть опыт в обработке спец.символов или если есть кое-какие соображения на этот счет....
Вложения
Тип файла: zip Codec.zip (23.5 Кб, 8 просмотров)
freeaccess1 вне форума Ответить с цитированием
Старый 28.03.2015, 19:46   #2
Казанский
Старожил
 
Аватар для Казанский
 
Регистрация: 31.12.2010
Сообщений: 2,133
По умолчанию

Для ВПР спец. символами являются * ? ~ . Прочитайте справку по функции. Вам "повезло" с тильдой .
exceleved@yandex.ru Яндекс.Деньги: 410011500007619
Казанский вне форума Ответить с цитированием
Старый 28.03.2015, 19:57   #3
Hugo121
Старожил
 
Регистрация: 11.05.2010
Сообщений: 5,166
По умолчанию

Я сделал рабочую версию, заменив ВПР() на поиск в словаре, ну и на листе продублировал апостроф.
Но потерял файл...
webmoney: E265281470651 Z422237915069 R418926282008
Hugo121 вне форума Ответить с цитированием
Старый 28.03.2015, 20:13   #4
Казанский
Старожил
 
Аватар для Казанский
 
Регистрация: 31.12.2010
Сообщений: 2,133
По умолчанию

Чтобы "допилить" существующие функции, надо перед Vlookup проверить, является ли символ для поиска одним из специальных, и если да, то добавить тильду:
Код:
'textCoder

If InStr("*?~", symbolС) Then symbolС = "~" & symbolС

'textDecoder

If InStr("*?~", symbolD) Then symbolD = "~" & symbolD
И почему-то у меня функция в В7 не обновляется автоматически, приходится входить в ячейку и нажимать Enter. Что за глюк?
exceleved@yandex.ru Яндекс.Деньги: 410011500007619
Казанский вне форума Ответить с цитированием
Старый 29.03.2015, 15:19   #5
freeaccess1
 
Регистрация: 28.03.2015
Сообщений: 4
По умолчанию Задача решена!

Казанский, спасибо за пояснения - задача решена!

Я никогда не работал с VBA и благодаря вашим пояснениям все получилось.

Совет по спец.символам пришелся как нельзя кстати!
И более того, ваши две строчки кода натолкнули меня на мысль, которая поборола проблему с цифрами.

Теперь все работает, по крайней мере исходя из результатов выборочного тестирования.

Если интереснен результат, файлик во вложении!))

И еще + инфа по пересчету функций. Вычитал, что Vlookup (и другие функции) может давать сбой в автоматическом пересчете (особенно когда есть больше одной ссылки на другие ячейки), поэтому в MS придумали функции, по следующим горячим клавишам, чтобы исправить подобные глюки:

F9 Пересчитывает измененные после последнего вычисления формулы и формулы, зависящие от них, во всех открытых книгах.
Если установлен автоматический пересчет книги, нажимать клавишу F9 для пересчета не требуется.

SHIFT+F9 Пересчитывает измененные после последнего вычисления формулы и формулы, зависящие от них, в активном листе.

CTRL+ALT+F9 Пересчитывает все формулы во всех открытых книгах, независимо от того, были они изменены в прошлый раз или нет.

CTRL+SHIFT+ALT+F9 Проверяет зависимые формулы, а затем пересчитывает все формулы во всех открытых книгах, независимо от того, были они изменены в прошлый раз или нет
Вложения
Тип файла: zip Codec.zip (24.4 Кб, 4 просмотров)

Последний раз редактировалось freeaccess1; 29.03.2015 в 16:30.
freeaccess1 вне форума Ответить с цитированием
Старый 29.03.2015, 16:49   #6
freeaccess1
 
Регистрация: 28.03.2015
Сообщений: 4
По умолчанию Докручиваем в сторону идеальности....

Наверное, это будет дурным тоном - начинать другую тему в текущей - но новая тема тесно связана с решением предыдущей задачи.

Были написаны два алгоритма: один - кодировщик, второй - дешифровщик.
Но если посмотреть на них внимательно, то увидим, что алгоритмы абсолютно одинаковы!

Выходит, что нам в идеале не нужны оба алгоритма - достаточно всего лишь одного.
Единственное, что необходимо решить, это как грамотно передать на вход в нашу функцию диапазон значений (особенной из нетекущих листов) как параметр.

Может, кто в курсе, где можно почитать об этом?

Последний раз редактировалось freeaccess1; 29.03.2015 в 16:54.
freeaccess1 вне форума Ответить с цитированием
Старый 29.03.2015, 17:15   #7
freeaccess1
 
Регистрация: 28.03.2015
Сообщений: 4
По умолчанию Как оказалось, ничего сложного:

Код:
 
Function Codec(myText, myRange As Range)
    
    Dim oldText As String
    
    oldText = myText.text
    
    Dim index As Integer
    Dim newText As String, symbol As String, newSymbol As String

    For index = 1 To Len(oldText)
    
        symbol = Mid(oldText, index, 1)
        
        If InStr("*?~", symbol) <> 0 Then symbol = "~" & symbol
        
        If InStr("0123456789", symbol) <> 0 Then
            
            Dim symbolAsNumber As Byte
            
            symbolAsNumber = CByte(symbol)
            
            newSymbol = Application.VLookup(symbolAsNumber, myRange, 2, False)
            
        Else
        
            newSymbol = Application.VLookup(symbol, myRange, 2, False)
            
        End If
        
        newText = newText & newSymbol
        
    Next index
    
    Codec = newText
        
End Function

Последний раз редактировалось freeaccess1; 29.03.2015 в 17:32.
freeaccess1 вне форума Ответить с цитированием
Старый 29.03.2015, 18:17   #8
IgorGO
Новичок
СтарожилДжуниор
 
Аватар для IgorGO
 
Регистрация: 05.02.2008
Сообщений: 9,487
По умолчанию

Цитата:
Докручиваем в сторону идеальности
двигаться в сторону идеального кода, это все равно что пытаться настичь горизонт, аккуратнее на этом пути

Код:
Function Codec(myText, myRange As Range, Optional DeCode As Boolean = False)
    Dim oldText As String
    oldText = myText.Text
    Dim index As Integer, FndCell As Range
    Dim newText As String, symbol
    For index = 1 To Len(oldText)
      symbol = Mid(oldText, index, 1)
      If InStr("*?~", symbol) <> 0 Then symbol = "~" & symbol
      If InStr("0123456789", symbol) <> 0 Then symbol = Val(symbol)
      Set FndCell = myRange.Find(symbol, LookIn:=xlValues, lookat:=xlWhole)
      newText = newText & FndCell.Offset(0, IIf(DeCode, -1, 1))
    Next index
    Codec = newText
End Function
предполагается стандартные символы находятся рядом с теми, в которые их предстоит кодировать, на одну колонку левее от символов
для шифрования.
для шифрования вызываете Codec с диапазоном стандартных символов,
для обратной процедуры - с шифрованными символами и третим параметром True

удачи!
"идеальный код, не тот в который нечего добавить, а тот, из которого нечего убрать..."
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете
IgorGO вне форума Ответить с цитированием
Старый 29.03.2015, 20:40   #9
IgorGO
Новичок
СтарожилДжуниор
 
Аватар для IgorGO
 
Регистрация: 05.02.2008
Сообщений: 9,487
По умолчанию

и строго, разбирая название темы,
на самом деле ни какой проблемы с шифорованием спецсимволов нет, шифруются как и все остальные и ничем от них не отличаются
а вот с поиском спецсимволов в тексте или списке есть проблема, и то - только до того времени, пока ничего не знать о их существовании.
но когда уже в теме заявлено, опуская опечатку, о "спецсимволах" то какие вообще могли быть проблемы? в справке ексель это описано и на этом акцентировано внимание.

читайте справку, все можно раскопать, достаточно немного настойчивости, а если читать вслух, то еще научитесь произносить много английских слов или посмешите окружающих, как это делаю я
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете
IgorGO вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
математические алгоритмы при шифровании Mimono Помощь студентам 0 01.04.2014 11:36
Потеря регистра букв при шифровании в base64 Dominatorsha Общие вопросы .NET 1 03.02.2014 17:39
Кодировка при шифровании PwnOwned C# (си шарп) 0 24.06.2013 17:57
Проблема с записью и чтением из файла при шифровании dolphin705 Общие вопросы Delphi 8 25.10.2011 16:13
Ошибка при шифровании disaer Общие вопросы C/C++ 3 29.09.2010 10:32