如何将 AnsiString 转换为 TBytes,反之亦然?

3

我有一个AnsiString,需要以最有效的方式将其转换为 TBytes。我该如何做?

2个回答

10

BytesOf 函数将 AnsiString 转换为 TBytes。

var
  A: AnsiString;
  B: TBytes;
begin
  A := 'Test';
  B := BytesOf(A);

  // convert it back
  SetString(A, PAnsiChar(B), Length(B));
end;

@DavidHeffernan 不是的,但那不是楼主的问题 :-) - HeartWare
1
@HeartWare 请再次阅读问题标题。 - David Heffernan
确实。我只是在晚些时候注意到它在标题中,然后将其作为编辑添加进去的。 - David Heffernan
2
请注意,如果输入字符串为空,则 BytesOf() 会崩溃,因为它在索引字节和字符串之前没有检查 Length=0。像 David 展示的那样使用 SetLength()+Move()Pointer 类型转换不会遇到这个问题。还要注意,反过来使用 SetString() 比显式使用 SetLength()+Move() 更简单:SetString(ansiStr, PAnsiChar(bytes), Length(bytes)); - Remy Lebeau
是的,SetString() 更好。我已经更新了代码。BytesOf('') 对我来说没有崩溃。我只是运气好吗? - Sebastian Z
显示剩余2条评论

7
假设您想保留相同的编码方式,您可以这样做:
SetLength(bytes, Length(ansiStr));
Move(Pointer(ansiStr)^, Pointer(bytes)^, Length(ansiStr));

倒序排列
SetLength(ansiStr, Length(bytes));
Move(Pointer(bytes)^, Pointer(ansiStr)^, Length(bytes));

谢谢David,很遗憾除了复制内存没有其他的方法 :( - zeus
1
反正,你为什么还要使用ANSI编码的字符串?真的没有必要。 - David Heffernan
4
@RudyVelthuis 不是每个人都编写 Web 服务器,但有些人确实这么做。对于他们来说,性能很重要。仅因为您没有以特定方式使用 Delphi,并不意味着它对某些人不重要。这是您经常反复的一种说法,如果批评涉及您不受影响的弱点,您就会有忽视的倾向。 - David Heffernan
1
实际上不是一样的。编码是不同的。复制可以避免。但是当您同时使用AnsiString和TBytes时,无法避免复制。 - David Heffernan
1
AnsiString在Linux上毫无意义,因为它没有ANSI编码。 - David Heffernan
显示剩余22条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接