我最近将 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;
我得到了罕见的符号,看起来是字符编码问题。谁能告诉我我哪里错了。
致以诚挚的问候。
最佳答案
不要使用字符数组作为缓冲区,使用“字节数组”而不是“字符数组”,它会自动使您的代码独立于字符大小。或者,您可以对二进制数据使用 RawBinaryString 类型。
SizeOf(buff) 是指针的大小(4 或 8 个字节,具体取决于目标),您应该使用类似“Length(buff)*SizeOf(buff[0])”的内容
不要忘记,在新的 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;
关于delphi - 在 Delphi XE5 中使用 Socket Recv 方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19347698/