Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Delphi XE5中使用Socket Recv方法_Delphi_Sockets_Encoding_Character_Recv - Fatal编程技术网

在Delphi XE5中使用Socket Recv方法

在Delphi XE5中使用Socket Recv方法,delphi,sockets,encoding,character,recv,Delphi,Sockets,Encoding,Character,Recv,我最近将我的Delphi7IDE更改为DelphiXe5(大的更改)。我正在处理一个小型客户机/服务器应用程序,在尝试读取字符串时遇到问题 我的代码: Function TIOHandler.readString(Var data: String): Integer; Var byteReceived: Integer; buff: Array Of Char; Begin byteReceived := 0; Result := 0; SetLength(buff, 255

我最近将我的Delphi7IDE更改为DelphiXe5(大的更改)。我正在处理一个小型客户机/服务器应用程序,在尝试读取字符串时遇到问题

我的代码:

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类型的内容

  • 更新:您可以转换StringRawBinaryString,例如:

    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;
    
  • 不要使用字符数组作为缓冲区,使用“字节数组”而不是“字符数组”,它会自动使您的代码独立于字符大小。或者,您可以对二进制数据使用RawBinaryString类型

  • SizeOf(buff)是指针的大小(4或8个字节,取决于目标),您应该使用类似“Length(buff)*SizeOf(buff[0])”

  • 不要忘记,在新的Delphi编译器中,默认情况下char的大小是2,强烈建议阅读Delphi中有关char/string类型的内容

  • 更新:您可以转换StringRawBinaryString,例如:

    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;
    

    谢谢你的评论Andrei,我会解决的。我还想说,我已经通过用AnsiString替换字符串解决了这个问题,所以我发送和接收AnsiString。你觉得怎么样?哪个更好?在我的例子中是Ansi还是Unicode?@Samuel在某些情况下(例如,当您分配不同类型的字符串变量时),Delphi可以进行隐式转换,它可能会损坏字符串中保存的二进制数据。我认为在您的情况下,最好使用RowBinaryString类型而不是AnsiString(这与使用字节数组几乎相同)。我不知道你需要什么样的字符串,从代码上看,你似乎用字符串来传输二进制数据。它是用于客户机/服务器应用程序的。因此,我将发送/接收字符串和二进制数据。我想保留字符串,但正如我之前所说的,当我通过recv()读取字符串时,我会得到罕见的字符。@Samuel你可以使用RawBinaryString获取二进制数据,当你需要发送文本字符串时,你可以轻松地将其从字符串转换为RawBinaryString,反之亦然(我添加了一个小示例)。感谢你的评论,Andrei,我会修复它。我还想说,我已经通过用AnsiString替换字符串解决了这个问题,所以我发送和接收AnsiString。你觉得怎么样?哪个更好?在我的例子中是Ansi还是Unicode?@Samuel在某些情况下(例如,当您分配不同类型的字符串变量时),Delphi可以进行隐式转换,它可能会损坏字符串中保存的二进制数据。我认为在您的情况下,最好使用RowBinaryString类型而不是AnsiString(这与使用字节数组几乎相同)。我不知道你需要什么样的字符串,从代码上看,你似乎用字符串来传输二进制数据。它是用于客户机/服务器应用程序的。因此,我将发送/接收字符串和二进制数据。我想保留字符串,但正如我前面所说的,当我通过recv()读取字符串时,我会得到罕见的字符。@Samuel您可以使用RawBinaryString获取二进制数据,当您需要发送文本字符串时,您可以轻松地将其从字符串转换为RawBinaryString,反之亦然(我添加了一个小示例)。