Delphi使用偏移量在部分字符串中使用CopyMemory拆分字符串

时间:2015-07-01 02:18:50

标签: delphi split copymemory

我想在X部分字符串中拆分字符串。

到目前为止,这是我的代码:

procedure SplitFile(var a: StringArray; len: integer; fileString: AnsiString; numberParts: integer);
var
  i, Rest, partSize: integer;
  tmp: AnsiString;
begin
  Rest := len mod numberParts;
  SetLength(a, numberParts);
  partSize := (len - Rest) div numberParts;
  numberParts := numberParts - 1;
  for i := 0 to numberParts do
  begin
    // Get access violation here
    CopyMemory(@a[i][1], @filestring[i * partSize], partSize);
  end;
  if Rest <> 0 then
    CopyMemory(@a[numberParts][numberParts*partSize], @filestring[numberParts*partSize], Rest);
end;

我在此行收到访问冲突:

CopyMemory(@a[i][1], @filestring[i * partSize], partSize);

我不确定导致错误的确切位置。 我如何获得 a [i] 的地址,罪恶 @a [i] [1] ?当它试图在第一个循环中访问 @filestring [i * partSize] 时导致它出错,因为它会为0?

我希望有人可以解释一下。

由于

2 个答案:

答案 0 :(得分:2)

您的代码对于您尝试的内容而言过于复杂。请尝试使用这个更简单的代码:

// assuming StringArray is "array of (Ansi)String"...
procedure SplitFile(var a: StringArray; len: integer; fileString: AnsiString; numberParts: integer);
var
  i, partSize: integer;
begin
  partSize := len div numberParts;
  SetLength(a, numberParts);
  for i := 0 to numberParts-1 do begin
    a[i] := Copy(filestring, (i * partSize)+1, partSize);
  end;
end;

在最后一次迭代中,如果请求的计数超过请求的偏移量处的可用字符数,Copy()将截断返回的子字符串。

答案 1 :(得分:1)

我看到三个主要问题:

  • 过度计数部分计数导致阵列长度确定错误。
  • 您必须添加1才能正确处理ansistring chars:
  • 必须设置目标字符串的长度

    var jwtToken = new JwtSecurityToken(token); jwtToken.Subject

最后一件治疗也是如此