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
.