代码之家  ›  专栏  ›  技术社区  ›  Friso

如何将空字符串解析为字节数组?

  •  -1
  • Friso  · 技术社区  · 11 年前

    我必须使用一个在Android上使用ansistring、ansichar等的旧单元,以前是在Delphi2007上构建的,所以我正在努力使其与XE7兼容。

    我遇到了几行将空字符串放入AnsiString的代码,如下所示: FAnsiString := '' ,但现在AnsiString是一个字节数组( FAnsiString : array of Byte )我收到消息E2010不兼容类型。

    我试图通过为数组创建一个类型来解析它( type TArrayOfByte = array of Byte )并尝试这样解析它: FAnsiString := TArrayOfByte ('') . 但是我得到了E2089无效的TypeCast。

    如何使其正常工作?

    下面是它应该如何工作的简化。 基本上,我需要一个返回字节数组的函数。 根据参数的不同,该函数的结果应该是空字符串。

    {$ifdef android}
      type AnsiString = array of Byte;
    {$endif}
    
    function FooBar(arguments) : AnsiString
    begin
      if false then
      Result := '';
    end;
    
    1 回复  |  直到 11 年前
        1
  •  1
  •   Remy Lebeau    11 年前

    Delphi字符串和动态数组都包含 nil 指针。因此:

    var
      FAnsiString: AnsiString;
    
    FAnsiString := '';
    

    在幕后有效地做到了这一点:

    // FAnsiString := '';
    if Pointer(FAnsiString) <> nil then
    begin
      // decrement reference count, if 0 then free memory ...
      Pointer(FAnsiString) := nil;
    end;
    

    动态数组的作用完全相同。这:

    var
      FAnsiString: array of Byte;
    
    FAnsiString := nil;
    // Alternatively:
    // SetLength(FAnsiString, 0);
    

    正在有效地执行与 AnsiString 幕后清理:

    // FAnsiString := nil;
    if Pointer(FAnsiString) <> nil then
    begin
      // decrement reference count, if 0 then free memory ...
      Pointer(FAnsiString) := nil;
    end;
    

    二者都 Ansi字符串 动态数组是编译器管理的ref计数类型。它们都自动初始化为 无 .

    同样地 Ansi字符串 空字符串的比较:

    var
      FAnsiString: AnsiString;
    
    if FAnsiString = '' then
    ...
    if FAnsiString <> '' then
    

    有效地只是检查 无 指针:

    if Pointer(FAnsiString) = nil then
    ...
    if Pointer(FAnsiString) <> nil then
    

    与动态数组相同,只有您可以在没有类型转换的情况下执行此操作:

    var
      FAnsiString: array of byte;
    
    if FAnsiString = nil then
    ...
    if FAnsiString <> nil then
    

    另一种方法是使用 Length() 和 SetLength() ,适用于字符串和动态数组:

    var
      FAnsiString: AnsiString;
    
    if Length(FAnsiString) = 0 then
      ...
    
    if Length(FAnsiString) <> 0 then
      ...
    
    SetLength(FAnsiString, 0);
    

    var
      FAnsiString: array of byte;
    
    if Length(FAnsiString) = 0 then
      ...
    
    if Length(FAnsiString) <> 0 then
      ...
    
    SetLength(FAnsiString, 0);
    

    当然,总有安德烈亚斯·豪斯拉登的补丁可以帮助 Ansi字符串 在移动编译器中:

    The Return of the Byte-Strings

    System.ByteStrings support for XE5 Update 2 (以及XE6和XE7)