0

我正在从内存中读取一些数据,而这个内存区域是 Unicode。所以要制作一个 ansi 字符串,我需要这样的东西:

  while CharInSet(Chr(Ord(Buff[aux])), ['0'..'9', #0]) do
    begin
      Target:= Target + Chr(Ord(Buff[aux]));
      inc(aux);
    end;

其中 Buff 是字节数组,目标是字符串。我只想在目标为 0..9 时继续获得 Buff 并添加目标,但是当它找到 NULL memory char (00) 时,它就会停止。如何在 Target 中继续添加数据,直到第一个字母或非数字字符?#0 无效。

4

2 回答 2

3

如果您的数据是 Unicode,那么我假设编码是 UTF-16。在这种情况下,您无法逐字节处理它。一个字符单元是 2 个字节宽。先将数据放入Delphi字符串,然后解析:

var
  str: string;
....
SetString(str, PChar(Buff), Length(Buff) div SizeOf(Char));

这样做,你的循环看起来像这样:

for i := 1 to Length(str) do
  if not CharInSet(str[i], ['0'..'9']) then
  begin
    SetLength(str, i-1);
    break;
  end;

我相信您的困惑是由逐字节处理引起的。对于 UTF-16 编码的文本,ASCII 字符被编码为一对字节,其中最重要的是零。我怀疑这解释了你试图通过你的CharInSet电话实现的目标。

如果您想满足其他数字字符,那么您可以使用该Character单元并使用TCharacter.IsDigit().

于 2012-05-16T16:37:45.980 回答
3

我什至不会打扰,CharInSet()因为您处理的是字节而不是字符:

var
  b: Byte;

while aux < Length(Buff) do
begin
  b := Buff[aux];
  if ((b >= Ord('0')) and (b <= Ord('9'))) or (b = 0) then
  begin
    Target := Target + Char(Buff[aux]); 
    Inc(aux); 
  end else
    Break;
end; 
于 2012-05-16T17:34:08.800 回答