Problem
我尝试使用帕斯卡函数EncodeStringBase64
,假设 Inno Setup 可以访问 Pascal 标准库,但它无法找到它并提供一个Unknown Identifier
error.
https://www.freepascal.org/docs-html/fcl/base64/encodestringbase64.html https://www.freepascal.org/docs-html/fcl/base64/encodestringbase64.html
我还发现了这段代码来执行转换,但它似乎仅限于 AnsiStrings。
https://github.com/docker/toolbox/blob/master/windows/base64.iss https://github.com/docker/toolbox/blob/master/windows/base64.iss
Question
理想情况下,我想使用标准库函数,有什么方法可以访问它吗?
如果不是,如果我更改签名,使用 AnsiStrings 的代码可以安全地在普通 Unicode 字符串上使用吗?
我打算对其进行测试,但我担心我会测试大量用例,但这并不能保证它实际上适合every字符,并且可能存在边缘情况。
Base64 编码bytes, not 人物(字符串)。这也可能是原因,为什么Encode64
您发现实施需要AnsiString
. AnsiString
在 Inno Setup Pascal 脚本中通常(滥用)用作动态数组bytes. While string
是一个数组人物.
如果要对字符串进行编码,首先必须将字符串表示为字节数组(以 Base64 编码字符串的接收者期望的方式),然后可以使用Encode64
执行。
如果你只编码 ASCII 字符,你可以盲目地转换string
to AnsiString
。如果您使用非 ASCII 字符,您可能需要转换您的UnicodeString
使用某种编码(例如 UTF-8)转换为字节。
至于结果字符串,您可以安全地从AnsiString
to string
,因为 Base64 仅使用 ASCII 字符(不过,更改函数签名以返回也是有意义的)string
,确实如此returns字符串,而不是字节数组)。
因此对于 ASCII 输入,可以这样做:
Base64 := string(Encode64(AnsiString(S)));
如果你想使用“标准”功能,你可以使用CryptBinaryToStringWinAPI函数 https://learn.microsoft.com/en-us/windows/win32/api/wincrypt/nf-wincrypt-cryptbinarytostringw。尽管这不会让您免于解决上述问题,因为该函数在输入上接受一个字节数组(如预期的那样)。
仅当您使用 Unicode Inno Setup(正确操作)时,上述内容才会有所不同。如果您使用了 Ansi Inno Setup(您不应该使用的),string
is AnsiString
.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)