3

2つの文字列があり、等しいかどうかを比較する必要があります。

文字列1は次のように作成されます。

var
    inBuf: array[0..IN_BUF_SIZE] of WideChar;
    stringBuilder : TStringBuilder;
    mystring1:string;
    ...
begin

stringBuilder := TStringBuilder.Create;

for i := startOfInterestingPart to endOfInterestingPart do
begin
  stringBuilder.Append(inBuf[i]);
end;

mystring1 := stringBuilder.ToString();
stringBuilder.Free;

文字列2は定数文字列'ABC'です。

文字列1がデバッグコンソールに表示される場合、それは「ABC」と同じです。しかし、比較

  1. AnsiCompareText(mystring1, 'ABC')
  2. mystring1 = 'ABC'
  3. CompareStr(mystring1, 'ABC')

すべてが不平等を報告しています。

'ABC'文字列2( )を文字列1と同じ型に変換する必要があると思います。

どうやってやるの?

2012年9月26日更新:

aMessageログ出力に{FDI-MSG-START-Init-FDI-MSG-END}として表示されます

文字列の長さを出力するためのコードは次のとおりです。

StringToWideChar('{FDI-MSG-START-Init-FDI-MSG-END}', convString, iNewSize);

...

OutputDebugString(PChar('Len (aMessage): ' + IntToStr(Length(aMessage))));
OutputDebugString(PChar('Len (original constant): ' + IntToStr(Length('{FDI-MSG-START-Init-FDI-MSG-END}'))));
OutputDebugString(PChar('Len (convString): ' + IntToStr(Length(convString))));

そして、これがログ出力です:

[3580] Len (aMessage): 40
[3580] Len (original constant): 32
[3580] Len (convString): 0
4

1 に答える 1

2

Length(aMessage)ソース文字列の長さが32であるのに対し、更新では、意味のある部分が40を返した後、ワイド文字列にガベージデータを保持しているようです。

Delphiでは、ワイド文字列はCOM BSTRと互換性があります。つまり、null文字を保持でき、nullで終了せず、文字データの負のオフセットで長さを維持します。その中にある可能性のあるヌル文字は、他の文字列タイプに変換するのに役立ちますが、それ自体の終了を変更することはありません。

以下を考慮してください、

const
  Source = '{FDI-MSG-START-Init-FDI-MSG-END}';
var
  ws: WideString;
  size: Integer;
begin
  size := 40;
  SetLength(ws, size);
  StringToWideChar(Source, PWideChar(ws), size);

  // the below assertion fails when uncommented
//  Assert(CompareStr(Source, ws) = 0);

  ws := PWideChar(ws);  // or SetLength(ws, Length(Source));
  // this assertion does not fail
  Assert(CompareStr(Source, ws) = 0);
end;
于 2012-09-26T13:09:23.273 に答える