Итак, я создаю обфускатор изображений, который поможет сохранить конфиденциальность моих изображений на общем компьютере. Идея состоит в том, чтобы прочитать содержимое изображения, преобразовать массив байтов в соответствующий ему массив ANSI, преобразовать ANSI (десятичный) в шестнадцатеричный и, наконец, сохранить этот массив шестнадцатеричных кодов в новом файле. Тогда я могу просто удалить исходный файл.
На данный момент я пришел к следующему:
Dim scr_filename As String = My.Computer.FileSystem.SpecialDirectories.Desktop + "\mypic.jpg"
Dim fdata = My.Computer.FileSystem.ReadAllBytes(scr_filename)
Dim res As String = "", fstr As String, num As Integer
fstr = System.Text.Encoding.Default.GetString(fdata)
For i As Integer = 0 To (fstr.Length - 1)
num = Asc(fstr.Substring(i, 1))
res += num.ToString + " "
Next
MsgBox(res)
Проблема с этим кодом заключается в том, что преобразование файла размером 20 КБ в ANSI занимает около 10 секунд, а если файл размером более 20 КБ, он просто зависает, и я вообще не получаю никакого вывода. Также обратите внимание, что на данный момент это только преобразование байтов в их значения ANSI, а не преобразование ANSI в соответствующий им шестнадцатеричный код.
Есть ли способ оптимизировать этот код, чтобы иметь возможность конвертировать файлы размером до 400-500 КБ? Большое спасибо.
Я создаю обфускатор изображений, который поможет сохранить конфиденциальность моих изображений на общем компьютере: стандарт заключается в том, чтобы НЕ хранить какие-либо личные данные на общем компьютере — это одна из причин существования USB-накопителей.
@Jimi: Согласно Классу TripleDES : доступен новый алгоритм симметричного шифрования, Advanced Encryption Standard (AES). Рассмотрите возможность использования класса Aes и его производных классов вместо класса TripleDES (в розовом поле). Если кого-то интересует AES-шифрование , может быть интересно следующее: stackoverflow.com/a/76349600/10024425 (Отказ от ответственности: я написал этот пост.)
@Itallmakescents Конечно, это также предлагается (то же самое) в сообщении, на которое я дал ссылку (единственное, связанное с шифрованием, которое я написал в VB.NET :). Какое значение имеет использование симметричного шифрования, а не асимметричного (для этого)
@Itallmakescents это компьютер у меня дома, которым пользуются все. Это не рабочий компьютер. Я не имею в виду, что планирую запутать свои обнаженные фотографии или что-то в этом роде. Просто я не хочу, чтобы сестра показывала мои шорты, плавание, костер и тому подобные фотографии своим друзьям, которые приходят сюда facepalm
@Джими, я знаю основные принципы шифрования. Давным-давно я создал программу множественного шифрования подписки и транспозиционного шифрования на VB6. Я новичок в vb.net и делаю это как вызов. В противном случае я мог бы просто поместить все эти изображения в архив, заблокировать его паролем и затем отправить по электронной почте себе. Это будет файл размером ~ 25-30 МБ. Но если бы я пошел по этому пути, я бы не узнал ничего нового о vb.net, что было бы признанием поражения.
Если вы ставите перед собой задачу в чем-то, я советую выбрать что-то стоящее и имеющее действительное значение, а также не склонное к ошибкам, которые невозможно отладить. -- Дальнейшие предложения: полностью отказаться от VB6 (например, MsgBox()
или Asc()
). Возможно также использование таких вещей, как My.Computer.FileSystem
, и использование пространств имен, предоставляемых .NET (как System.IO.File
). Отбросьте любые виртуальные знания о том, что на самом деле представляет собой ANSI. В лучшем случае это многобайтовое представление, тесно связанное с локальной кодировкой. Несмотря на название, кодовые страницы Windows не соответствуют стандартам ANSI/ISO. Вместо этого подумайте о Юникоде
Windows имеет возможность иметь несколько учетных записей пользователей на одном компьютере, и установка разрешений безопасности может запретить другим пользователям доступ к файлам.
Функция Asc внутри цикла может работать медленно при обработке больших объемов данных.
Вам не нужно преобразовывать байты в символы, а затем в значения ANSI, просто обрабатывайте байты напрямую.
Dim scr_filename As String = My.Computer.FileSystem.SpecialDirectories.Desktop + "\mypic.jpg"
Dim fileBytes As Byte() = File.ReadAllBytes(scr_filename)
Dim hexString As String = String.Join("", fileBytes.Select(Function(b) b.ToString("X2")))
File.WriteAllText("path_to_your_output_file.txt", hexString)
Ух ты. Просто... вау! Элегантное решение!
У меня был этот код для вывода файла в шестнадцатеричном формате. Модифицировано для вашего использования.
Const perLine As Integer = 8
Dim count As Integer = 0
Dim sb As New System.Text.StringBuilder
Using fs As IO.FileStream = IO.File.OpenRead("input filename here")
Using br As New IO.BinaryReader(fs)
Do Until fs.Position = fs.Length
Dim byt As Byte = br.ReadByte()
sb.Append(byt.ToString("X2").PadLeft(2, "0"c))
' sb.Append(" ")
count += 1
If count = perLine Then
'sb.AppendLine()
count = 0
End If
Loop
End Using
End Using
IO.File.WriteAllText("output filename here", sb.ToString)
Это, пожалуй, худшая из возможных идей. Почему бы вам вместо этого не зашифровать файл? Пример здесь