在 Inno Setup 中将字符串编码为 Base64(Inno Setup 的 Unicode 版本)

Encode string to Base64 in Inno Setup (Unicode Version of Inno Setup)

问题

我尝试使用 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 字符串?

我将对其进行测试,但我担心我会测试大量用例,但这并不能保证它实际上适用于 每个 个字符,可能存在边缘情况。

Base64 编码字节,而不是字符(字符串)。这也可能是您发现的 Encode64 实现需要 AnsiString 的原因。 AnsiString 在 Inno Setup Pascal 脚本中通常(滥用)用作 字节 的动态数组。 string 个字符的数组 .

如果你想对一个字符串进行编码,你首先必须将该字符串表示为字节数组(以 Base64 编码字符串的接收者所期望的方式),然后你可以使用你的 Encode64 实施。

如果你只编码 ASCII 字符,你可以盲目地将 string 转换为 AnsiString。如果您使用非 ascii 字符,您可能希望使用某种编码将 UnicodeString 转换为字节,例如 UTF-8。

至于生成的字符串,您可以安全地将其从 AnsiString 转换为 string,因为 Base64 仅使用 ASCII 字符(尽管将函数签名更改为 returnstring,因为它确实returns一个字符串,而不是字节数组)。

所以对于 ASCII 输入,这将是:

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

如果要使用"standard"函数,可以使用CryptBinaryToString WinAPI function。尽管这不会让您免于解决上述问题,因为该函数在输入时采用字节数组(如预期的那样)。


以上仅在您使用 Unicode Inno Setup(您正确执行的操作)时有所不同。如果你使用了 Ansi Inno Setup(你不应该使用的),stringAnsiString