【问题标题】:Delphi 10: Problems with SizeOf(string) - Windows vs AndroidDelphi 10:SizeOf(string) 的问题 - Windows 与 Android
【发布时间】:2016-03-17 11:27:58
【问题描述】:

我想使用 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;

在 Windows 10 中,我使用了以下代码:

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的传输字符串吗?

【问题讨论】:

    标签: android delphi indy10 delphi-10-seattle


    【解决方案1】:

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

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

    【讨论】:

    • 你说得对,我没有意识到我的 Windows 10 在 64 位上运行。谢谢。
    • 您的 Windows 10 系统是 64 位并不重要,重要的是您的 程序 是 64 位。
    • 是的,我知道。我只是用糟糕的措辞来回答。
    • 另一个值得一提的问题是,在移动平台上,字符串是从零开始的(第一个字符索引是 0),而在 Windows 上它们是从 1 开始的(第一个字符索引是 1)。因此,即使您设法将字符串的 RAW 内存数据从一个平台发送到另一个平台,您也不会得到相同的结果。因此,我同意 David 关于在不同平台之间发送数据之前序列化数据的观点。
    • @SilverWarior 不是真的。 string 变量始终指向第一个字符。那是 S[1] 用于从 1 开始的字符串,S[0] 用于从 0 开始的字符串。原始数据位于完全相同的位置。只是编译器会根据索引基数为[]运算符生成不同的代码。
    猜你喜欢
    • 1970-01-01
    • 2015-10-24
    • 1970-01-01
    • 1970-01-01
    • 2017-07-17
    • 1970-01-01
    • 2015-10-20
    • 2021-01-23
    • 2019-02-16
    相关资源
    最近更新 更多