Delphi 10:SizeOf(string) 的问题 - Windows vs Android

Delphi 10: Problems with SizeOf(string) - Windows vs Android

我想使用 Indy IdTCPClient 和 IdTCPServer 将 TMemoStream 从 Android 发送到 Windows。

问题是这样的:

SizeOf(string) in Android is 4 bytes
SizeOf(string) in Windows 10 is 8 bytes

在android中我使用了这段代码:

type TMyRecord = record
  x1: string;
  x2: string;
end;

var
  workRecord: TMyRecord;
  rInfo: TMemoryStream;
begin
  workRecord.x1:= 'Hello';
  workRecord.x2:= 'How are you';
  rInfo:= TMemoryStream.Create;

  try
    rInfo.Write(workRecord, SizeOf(workRecord));  //Size of workRecord is 8 bytes
    AndroidTCPClient.IOHandler.Write(workRecord, 0, False);
  finally
    rInfo.Free;
  end;
end;

在Windows10中我使用了这个代码:

type TMyRecord = record
  x1: string;
  x2: string;
end;

type TMyRecord = record
  x1: string;
  x2: string;
end;

var
  workRecord: TMyRecord;
  rInfo: TMemoryStream;
begin
  rInfo:= TMemoryStream.Create;

  try
    AContext.Connection.IOHandler.ReadStream(rInfo, SizeOf(workRecord), False);
    rInfo.Position:= 0;
    rInfo.Read(workRecord, SizeOf(workRecord)); //Size of workRecord is 16 bytes
  finally
    rInfo.Free;
  end;
end;

谁能告诉我如何设置从Android到Windows的传输字符串?

sizeof(string)是一个指针的大小。您的 Windows 程序显然是为 64 位编译的,因此指针为 8 字节宽。您的 Android 程序以 32 位为目标,指针为 4 字节宽。

更大的问题是您不能期望将指针从一个进程发送到另一个进程。指针指向发送程序中的内存。它们对接收者没有意义。您可能应该序列化您的数据,例如 JSON,然后发送它。然后收件人可以在收到后反序列化。