【问题标题】:Convert TMemoryStream to WideString in Delphi 7在 Delphi 7 中将 TMemoryStream 转换为 WideString
【发布时间】:2015-05-03 08:22:02
【问题描述】:

当我在 Delphi 7 中使用此代码和函数时,将显示错误消息:

此代码将 MemoryStream 内容转换为 WideString

function ReadWideString(stream: TStream): WideString;
var
  nChars: LongInt;
begin
  stream.Position := 0;
  stream.ReadBuffer(nChars, SizeOf(nChars));
  SetLength(Result, nChars);
  if nChars > 0 then
    stream.ReadBuffer(Result[1], nChars * SizeOf(Result[1]));
end;


procedure TForm1.Button2Click(Sender: TObject);
var
  mem: TMemoryStream;
begin
  mem := TMemoryStream.Create;
  mem.LoadFromFile('C:\Users\User1\Desktop\wide.txt');
  Memo1.Lines.Add(ReadWideString(mem));
end;

任何帮助将不胜感激。

【问题讨论】:

  • 当您在调试器中单步执行代码时,异常发生在哪一行?
  • 最后一行:stream.ReadBuffer(Result[1], nChars * SizeOf(Result[1]));
  • 请注意,您应该提及 the source 您从哪里获得此代码,以便我们可以选择在那里修复它(但不仅因为如此)。或者只是对帖子作者发表评论。在这种情况下,只需将帖子阅读到最后。
  • 这个code不行,我以前试过。

标签: delphi delphi-7


【解决方案1】:

您的代码可以正常工作。问题是您传递给函数的输入不是预期的格式。

您使用的函数需要一个包含长度的 4 字节整数,后跟 UTF-16 有效负载。

看起来您实际上有直接的 UTF-16 文本,没有附加长度。像这样阅读:

stream.Position := 0;
nChars := stream.Size div SizeOf(Result[1]);
SetLength(Result, nChars);
if nChars > 0 then
  stream.ReadBuffer(Result[1], nChars * SizeOf(Result[1]));

现在,您的输入可能包含 UTF-16 BOM。如果是这样,您将需要决定如何处理。

这里的底线是您需要您的代码与您提供的输入相匹配。

【讨论】:

    猜你喜欢
    • 2023-04-06
    • 2010-11-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多