Кодировать строку в Base64 в Inno Setup (Unicode-версия Inno Setup) - PullRequest
0 голосов
/ 24 октября 2018

Проблема

Я пытался использовать функцию Pascal EncodeStringBase64, предполагая, что Inno Setup имел доступ к стандартной библиотеке Pascal, но не может найти ее и выдает ошибку Unknown Identifier.

https://www.freepascal.org/docs-html/fcl/base64/encodestringbase64.html

Я также обнаружил, что этот код выполняет преобразование, но, похоже, он ограничен AnsiStrings.

https://github.com/docker/toolbox/blob/master/windows/base64.iss

Вопрос

В идеале я хотел бы использовать стандартную библиотечную функцию, есть ли способ получить к ней доступ?

Если нет, безопасен ли код, использующий AnsiStrings?использовать в обычных строках Unicode, если я изменю подпись?

Я собираюсь провести ее тестирование, но боюсь, что протестирую большое количество вариантов использования, но это неt гарантирует, что он действительно подходит для каждого символа, и могут существовать крайние случаи.

1 Ответ

0 голосов
/ 24 октября 2018

Base64 кодирует байтов , а не символов (строки).Это также, вероятно, причина, по которой найденная вами реализация Encode64 занимает AnsiString.AnsiString обычно (ab) используется в скрипте Inno Setup Pascal в качестве динамического массива байт .В то время как string представляет собой массив из символов .

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

Если вы кодируете только символы ASCII, вы можете просто слепо привести string к AnsiString.Если вы используете символы, отличные от ascii, вы, вероятно, захотите преобразовать свои UnicodeString в байты, используя некоторую кодировку, например UTF-8.

Что касается результирующей строки, вы можете просто безопасно преобразовать ее из AnsiString на string, поскольку Base64 использует только символы ASCII (хотя также имеет смысл изменить сигнатуру функции, чтобы она возвращала string, поскольку она действительно возвращает строку символов, а не байтовый массив).

Так что для входа ASCII это будет делать:

Base64 := string(Encode64(AnsiString(S)));

Если вы хотите использовать «стандартную» функцию, вы можете использовать CryptBinaryToString WinAPI-функцию .Хотя это не избавит вас от решения вышесказанного, так как функция принимает на вход массив байтов (как и ожидалось).


Вышесказанное имеет значение только в том случае, если вы используете UnicodeInno Setup (что вы правильно делаете).Если бы вы использовали Ansi Inno Setup (что не следует делать), string - это AnsiString.

...