【问题标题】:Encode string to Base64 in Inno Setup (Unicode Version of Inno Setup)在 Inno Setup 中将字符串编码为 Base64(Inno Setup 的 Unicode 版本)
【发布时间】:2019-03-28 18:32:14
【问题描述】:

问题

我尝试使用 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 inno-setup pascal freepascal pascalscript


    【解决方案1】:

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

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

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

    对于结果字符串,您可以安全地将其从 AnsiString 转换为 string,因为 Base64 仅使用 ASCII 字符(不过,将函数签名更改为返回 string 也很有意义,因为它确实如此返回一个字符串,而不是字节数组)。

    所以对于 ASCII 输入,这样就可以了:

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

    如果您想使用“标准”功能,可以使用CryptBinaryToString WinAPI function。虽然这不会让您免于解决上述问题,因为该函数在输入时采用一个字节数组(如预期的那样)。


    只有在您使用 Unicode Inno 设置(您正确的做法)时,上述内容才会有所不同。如果你使用过 Ansi Inno Setup(你不应该这样做),stringAnsiString

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-02-25
      • 1970-01-01
      • 2016-12-22
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多