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. 不要使用 char 数组作为缓冲区,使用“字节数组”而不是“char 数组”,它会自动使您的代码独立于 char 的大小。或者,您可以将 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 回答