Delphi 将字节数组转换为PAnsiChar

Delphi 将字节数组转换为PAnsiChar,delphi,delphi-xe2,Delphi,Delphi Xe2,我使用以下方法将名为“TmpData”的字节数组转换为PAnsiChar: PAnsiChar(@TmpData[0]); 但有些数据有换行符。如何删除换行符?请看下图 注意,在下面的回答中,我假设您的字节数组是ANSI编码的,以零结尾 将数据分配给字符串: var str: string; .... str := string(PAnsiChar(@TmpData[0])); 然后删除换行符: str := StringReplace(str, sLineBreak, '', [rf

我使用以下方法将名为“TmpData”的字节数组转换为PAnsiChar:

PAnsiChar(@TmpData[0]);
但有些数据有换行符。如何删除换行符?请看下图

注意,在下面的回答中,我假设您的字节数组是ANSI编码的,以零结尾


将数据分配给字符串:

var
  str: string;
....
str := string(PAnsiChar(@TmpData[0]));
然后删除换行符:

str := StringReplace(str, sLineBreak, '', [rfReplaceAll]);
您可能希望删除单个
#10
#13
字符,或者删除所有空白字符。这取决于你的需要,但本质在这里

或者,您可以遍历字节数组,删除所有希望删除的字节,例如,值为10和13,或值小于32的字节。然后转换到
PAnsiChar

idxDst := 0;
idxSrc := 0;
while TmpData[idxSrc] <> 0 do begin
  if TmpData[idxSrc] >= 32 then begin
    TmpData[idxDst] := TmpData[idxSrc];
    inc(idxDst);
  end;
  inc(idxSrc);
end;
TmpData[idxDst] := 0;
idxDst:=0;
idxSrc:=0;
当TmpData[idxSrc]0开始时
如果TmpData[idxSrc]>=32,则开始
TmpData[idxDst]:=TmpData[idxSrc];
公司(idxDst),;
结束;
公司(idxSrc),;
结束;
TmpData[idxDst]:=0;

那么您想从TmpData中删除所有的#10和#13吗?
PAnsiChar
类型转换和您的循环都假定
TmpData
以null结尾。如果不是这样,则必须考虑实际数组长度。要将
TmpData
分配给不存在空终止符的字符串,必须先调用
SetString()
TmpData
数据复制到
ansisting
变量中,然后您可以将其分配给目标
字符串
变量。@Remy该假设在问题中是隐式的,问题中没有任何内容表明字节数组是否包含任何空字节。@Remy问题中的强制转换表示将字节数组广播到
PAnsiChar
并不保证为空终止符存在于阵列中。