使用Delphi将字符串变量编码为UTF-16LE base64

时间:2016-07-15 15:39:29

标签: delphi delphi-xe2

我希望将字符串变量编码为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 '-'.

1 个答案:

答案 0 :(得分:2)

您所展示的内容在技术上是正确的。 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;

但不管怎样,输出都是一样的。所以你仍然有任何问题必须在其他地方。但是,您没有提供有关如何验证数据,拒绝哪些工具,实际报告的错误等的任何详细信息。