2

最近、Delphi 7 IDE を Delphi XE5 (大きな変更) に変更しました。小さなクライアント/サーバー アプリケーションで作業していますが、文字列を読み取ろうとすると問題が発生します。

私のコード:

Function TIOHandler.readString(Var data: String): Integer;
Var
  byteReceived: Integer;
  buff: Array Of Char;
Begin
  byteReceived := 0;
  Result := 0;
  SetLength(buff, 255);

  byteReceived := self.readBuffer(buff[0], SizeOf(buff));

  If (byteReceived > 0) Then
  Begin
    SetLength(data, SizeOf(buff));
    lstrcpyn(@data[1], @buff[0], SizeOf(buff));
    Result := byteReceived;
  End
  Else If byteReceived = SOCKET_ERROR Then
    Result := SOCKET_ERROR;
End;

Function TIOHandler.readBuffer(Var buffer; bufferSize: Integer): Integer;
Begin
  Result := recv(self.ioSocket.aSock, buffer, bufferSize, 0);
End;

まれなシンボルが表示されます。文字エンコードの問題のようです。誰が私が間違っているのか教えてもらえますか。

よろしくお願いします。

4

1 に答える 1

4
  1. バッファに文字の配列を使用しないでください。「文字の配列」の代わりに「バイトの配列」を使用すると、自動的にコードが文字のサイズに依存しなくなります。または、バイナリ データに RawBinaryString タイプを使用できます。

  2. SizeOf(buff) はポインターのサイズ (ターゲットに応じて 4 または 8 バイト) です。「Length(buff)*SizeOf(buff[0])」のようなものを使用する必要があります。

  3. 新しい Delphi コンパイラでは、デフォルトで char のサイズが 2 であることを忘れないでください。Delphi の char/string 型について読むことを強くお勧めします。

更新: たとえば、次のように String<->RawBinaryString を変換できます。

function BinToString(const s: RawByteString): String;
begin
  assert(length(s) mod SizeOf(result[1])=0);
  setlength(result, length(s) div SizeOf(result[1]));
  move(s[1], result[1], length(result)*SizeOf(result[1]));
end;

function StringToBin(const s: String): RawByteString;
begin
  setlength(result, length(s)*SizeOf(s[1]));
  move(s[1], result[1], length(result));
end;
于 2013-10-13T17:31:38.860 に答える