【问题标题】:How to convert AnsiString to TBytes and vice versa?如何将 AnsiString 转换为 TBytes,反之亦然?
【发布时间】:2018-06-28 10:09:08
【问题描述】:

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

【问题讨论】:

    标签: delphi data-conversion ansistring


    【解决方案1】:

    函数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 不,但这不是 OP 的问题 :-)
    • @HeartWare 再次阅读问题标题
    • 这几乎隐藏在标题中。我添加了一个关于将其转换回来的注释。
    • 确实如此。我只是在标题中发现它后才将它添加为编辑。
    • 请注意,如果输入字符串为空,BytesOf() 会崩溃,因为它在索引字节和字符串之前不会检查Length=0。使用 SetLength()+Move()Pointer 像 David 展示的类型转换不会遇到这个问题。另请注意,换一种方式,使用 SetString() 比使用 SetLength()+Move() 更简单:SetString(ansiStr, PAnsiChar(bytes), Length(bytes));
    【解决方案2】:

    假设您想保留相同的编码,您可以这样做

    SetLength(bytes, Length(ansiStr));
    Move(Pointer(ansiStr)^, Pointer(bytes)^, Length(ansiStr));
    

    反过来

    SetLength(ansiStr, Length(bytes));
    Move(Pointer(bytes)^, Pointer(ansiStr)^, Length(bytes));
    

    【讨论】:

    • 感谢大卫,遗憾的是他们除了复制记忆别无他法:(
    • 无论如何,您为什么还要使用 ANSI 编码的字符串?真的没有地方。
    • @RudyVelthuis 不是每个人都写网络服务器。不,但有些人会。对他们来说,性能很重要。仅仅因为您不以特定方式使用 Delphi 并不意味着它对某人不重要。这是你的常见副歌,如果批评与不影响你的弱点有关,你倾向于忽略批评。
    • 其实不,不一样。编码不同。复制肯定是可以避免的。但当您同时使用 AnsiString 和 TBytes 时则不然。
    • AnsiString 在没有 ANSI 编码的 Linux 上毫无意义。
    猜你喜欢
    • 2011-07-27
    • 2021-06-10
    • 2012-03-24
    • 2010-12-04
    • 2012-01-15
    • 1970-01-01
    • 1970-01-01
    • 2010-12-03
    相关资源
    最近更新 更多