- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
试图移动Delphi 2007
项目至XE4
.在 Delphi 2007
我正在使用从套接字读取字节数组的函数 Indy
直接地。我通过了AnsiString
转换为字节数组到此函数的 var 参数:
var data:AnsiString;
AContext.Connection.IOHandler.ReadBytes(TIDBytes(Data), PacketLength-PacketLengthDelta-1, False);
Dlphi XE
当我尝试连接
Data
到我得到的另一个字符串
access violation
错误。
TIdBytes = array of Byte;
procedure fill(var b: TIDBytes);
begin
setlength(b,5);
b[0]:=61;
b[1]:=61;
b[2]:=61;
b[3]:=61;
b[4]:=61;
//original function used move function
end;
procedure TMainForm.FormCreate(Sender: TObject);
var s: ansistring ;
begin
fill( TIDBytes(s) );
Showmessage(s);
end;
====
这样的东西在消息框中,但我得到了一个空的。我认为 XE AnsiString 的行为与 Delphi 2007 Ansistring 相同,您可以在这两种情况下像字节数组一样使用它们。
最佳答案
施放 AnsiString
永远无效到一个字节数组。该代码总是被破坏并且您很幸运(或不幸,取决于您的观点)。
托管字符串类型,就像动态数组一样,有一个额外的信息负载,即元数据,它存储在数据负载之前。此元数据包括引用计数、长度等。但字符串的元数据与动态数组的元数据不同。简单地说,字符串不是动态数组。您的重新解释类型转换完全无效。它在旧版本的 Delphi 中无效,在现代版本中同样无效。
真正发生在幕后的是元数据的大小随着 Unicode 支持的引入而发生了变化。 AnsiString
的元数据已扩大。例如,它现在包含字符串的代码页。
现在,当您调用 SetLength
,分配足够大的内存块用于元数据和有效负载。假设内存分配在地址 P。变量(字符串或动态数组)保存的地址设置为 P + 元数据大小。当您开始释放对象时,系统将移动到 P - 元数据大小并调用 FreeMem
与那个地址。这是踢球者。分配时使用动态数组元数据的大小,但释放时使用字符串元数据的大小。结果?繁荣!您刚刚调用了FreeMem
在一个无效的地址上,一个尚未分配给您的地址。
处理这个问题的正确方法是给 Indy 函数它想要的东西。即一个字节数组。如果您需要传输到字符串变量,请将字节数组的内容复制到新字符串中。例如使用 TEncoding.Default.GetString()
.
关于string - 在 Delphi XE4 中使用 AnsiString 之类的数组字节,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20611507/
就我的目的而言,我实际上真正使用的是 ASCII 字符数据(用于向州提交 ASCII 文本文件),因此仅使用 unicodestring 对最终结果没有帮助(我仍然需要转换一些内容)。 我可以选择在
我正在使用 C++ Builder XE3,我遇到了一个关于 AnsiString 的奇怪问题。 看看下面的代码 //Code 1: first time AnsiString temp1 = "te
我想将用户选择的目录路径复制到标签(C++ Bulder 6.0) Label->Caption=SelectDirectory("Select a folder:", "", RootDir); 但
我有一些代码可以在 D7 中正常编译,但在 D2010 中编译失败。显然这是一个 Unicode 问题: 编译错误是:E2251 对“StrPas”的不明确重载调用 整个过程如下: procedure
我创建了以下代码: Function AnsiStringToStream(Const AString: AnsiString): TStream; Begin Result := TString
我这里有一个案例,我要从Delphi 7迁移到delphi 2011 XE,令我惊讶的是,由于ansistrings,许多组件都会出现问题,在delphi xe中它们看起来像日文/中文字符,现在我使用
我正在准备 Delphi 2007 项目的某些部分,以便轻松迁移到 Delphi XE7。 我已经从 string 切换了事件处理程序的参数类型至AnsiString (此特定事件处理程序必须与 An
将包含转义组合变音标记(如“Fu\u0308rst”)的 Delphi XE AnsiString 转换为友好的 WideString“Fürst”的最佳方法是什么? 我知道这并不总是适用于所有组合,
我正在尝试从我的 CentOS VPS 发送一个 4063 字节的 AMR 文件(仅用于测试) nc IP 45500 \sample.amr', fmCreate); end; procedure
根据 FastMM4,我目前正在处理的 Delphi 程序泄漏了很多字符串。 AnsiStrings 准确地说: 应用程序 (http://sourceforge.net/projects/orwel
我有Delphi 2010。 XXX组件使用File_Path:AnsiString。路径可以用XXX语言编写。如果在Windows设置中设置为非Unicode程序使用XXX语言,则XXX组件可以识别
使用此(测试)代码从 PNG 读取文本块: procedure TForm1.Button1Click(Sender: TObject); var PngVar: TPngImage; n:
我有一个 C DLL,它返回一个指向由 C DLL 管理的 PAnsiChar 字符串的指针。我想复制该字符串,以便可以在 Delphi 端对其进行管理。 如果我将返回的 PAnsiChar 转换为
尝试将项目从 Delphi 2007 迁移到 Delphi XE4。在 Delphi XE4 中将 String 转换为 AnsiString 的最佳方法是什么? 最佳答案 您只需分配它即可: var
我在这里有一个类似的问题:Delphi XE - should I use String or AnsiString? 。在决定在我的(大型)库中使用 ANSI 字符串是正确的之后,我意识到我实际上可
在过去,我有一个函数可以转换 WideString到 AnsiString指定代码页的: function WideStringToString(const Source: WideString; C
对于 dapper,我需要构建对传递 AnsiString 参数的支持。 数据库有 unicode 和非 unicode 字符串,选择正确的参数类型有时很重要。 DbType.String 与 DbT
我正在尝试从以下答案中导入代码:Get full running process list ( Visual C++ ) bool FindRunningProcess(AnsiString proc
我在数据库中使用 Dapper,其中字符串主要存储在 VarChar 列中。默认情况下,Dapper 在生成查询时使用 NVarChar 参数,虽然我可以用 DbString 包装我使用的每个字符串参
令我烦恼的是转换。我正在使用 C++ Rad Studio XE8(不要问我为什么必须这样做)。 我有变量 AnsiString a = "D8"; char sz; 我希望 sz 看起来像这样 ch
我是一名优秀的程序员,十分优秀!