Delphi-将Ansichar转换为字符串,反之亦然

时间:2018-07-10 11:28:39

标签: string delphi templates fingerprint

我获得了一个从设备中获取指纹模板的SDK,我需要将其存储在SQL数据库中,然后重新加载到FP设备中。

SDK FP模板数据定义为template_data:array[0..1568] of ansichar;

通过使用以下代码将模板数据转换为字符串,可以将模板存储在数据库中。

SetString(s, user.template_data[i].template_data, 
          user.template_data[i].template_length);

将字符串从数据库转换回模板数据时会出现问题,使用StrLCopy时只会复制前3个字符

StrLCopy(PChar(@user.template_data[0].template_data),
         PChar(s), FieldByName('FPLen').AsInteger);

调试代码时,我注意到模板中有4个字符为空字符,所以我想这就是为什么仅复制前3个字符的原因。

需要一种将具有空字符的字符串复制到ansichar数组中的解决方案。

2 个答案:

答案 0 :(得分:0)

尝试像David指出的那样将Move与FillChar一起使用

FillChar(ArrayVariable[0], length(ArrayVariable) * sizeof(char), #0);
Move(StringVariable[1], ArrayVariable[0], length(s) * sizeof(char));

如果空字符仍然使您感到混乱,您可以尝试通过简单的循环“标准化”变量的内容(因为不能使用StringReplace,因为每个空字符都被强制转换为#0 PChar)

var
  i: Integer;
begin
  i:=1;
  while i <= Length(StringVariable) do begin
    if StringVariable[i] = #0 then begin
      Delete(StringVariable, i, 1)
    end else begin
      i := i+1;
    end;
  end;
end;

答案 1 :(得分:0)

不仅仅是这个吗?

function ArrayToString(const a: array of AnsiChar): string;
var
  i: integer;
begin
  for I := Low(a) to High(a) do
    Result := Result + a[i]
end;