unicode 版本 delphi ,如XE2的 TBytes 转换为 AnsiString

unicode 版本 delphi (如XE2)的 TBytes 转换为 AnsiString

在这样的新版本中如果结果数据会有二进制会使用 TBytes 来操作,而 d7 中基本上就是用 string . 也许是因为新版本 AnsiString 与 string 赋值会丢失数据的原因所以大多数库都是用的 TBytes 操作二进制包括 delphi 本身和 indy 控件.这就有一个问题 TBytes 怎么转换成 AnsiString 呢? 不知道标准做法是什么,我是这样处理的.利用了 AnsiString 的指针就是内容缓冲区这一 hack 特性.当然大家知道标准做法的话还是按标准来的比较好.

function Base64ToStr(const Base64: AnsiString): AnsiString;

var

buf:TBytes;

begin

//Result := EncdDecd.DecodeString(Base64);Exit;//

buf := EncdDecd.DecodeBase64(Base64);

//ShowMessage(PAnsiChar(@buf[0]));

//BytesToRaw(buf, head, SizeOf(TProtoHead));

//Result := BytesToString(buf, TIdTextEncoding.ASCII);Exit;//不对,即使是用了 ASCII 仍然进行了转码,没法得到原始数据

//Result := BytesToString(buf, TIdTextEncoding.UTF8);

//Result := (PAnsiChar(@buf[0]));

SetLength(Result, Length(buf));

//SetAnsiString(@Result, @buf[0], Length(buf));

//StrLCopy(PAnsiChar(result), @buf[0], Length(buf));//不行会在 #0 时出错

CopyMemory(PAnsiChar(result), @buf[0], Length(buf));

end;