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
C# 为什么我的编码显示两次? byte[]lengthBytes=新字节[4]; 读取(长度字节,0,4); MessageBox.Show(“'>>”+System.Text.Encoding.UTF8.GetString(lengthBytes)+“>/(请注意,这仍然是4个字符长,最后3个字节为空。 Msgbox 2:“>>{”ac_C#_Sockets_Utf 8_Tcp - Fatal编程技术网

C# 为什么我的编码显示两次? byte[]lengthBytes=新字节[4]; 读取(长度字节,0,4); MessageBox.Show(“'>>”+System.Text.Encoding.UTF8.GetString(lengthBytes)+“>/(请注意,这仍然是4个字符长,最后3个字节为空。 Msgbox 2:“>>{”ac

C# 为什么我的编码显示两次? byte[]lengthBytes=新字节[4]; 读取(长度字节,0,4); MessageBox.Show(“'>>”+System.Text.Encoding.UTF8.GetString(lengthBytes)+“>/(请注意,这仍然是4个字符长,最后3个字节为空。 Msgbox 2:“>>{”ac,c#,sockets,utf-8,tcp,C#,Sockets,Utf 8,Tcp,也许关于编码。GetString()会对您有所帮助。需要注意的部分是: 如果要转换的数据仅在连续块中可用 (如从流读取的数据)或如果数据量太大 如果需要将其划分为更小的块,则应使用 派生类的GetDecoder方法返回的Decoder对象 也许关于编码。GetString()会对您有所帮助。需要注意的部分是: 如果要转换的数据仅在连续块中可用 (如从流读取的数据)或如果数据量太大 如果需要将其划分为更小的块,则应使用 派生类的GetDecoder方法返回的Decoder对象 您正在犯传统的程序员

也许关于编码。GetString()会对您有所帮助。需要注意的部分是:

如果要转换的数据仅在连续块中可用 (如从流读取的数据)或如果数据量太大 如果需要将其划分为更小的块,则应使用 派生类的GetDecoder方法返回的Decoder对象

也许关于编码。GetString()会对您有所帮助。需要注意的部分是:

如果要转换的数据仅在连续块中可用 (如从流读取的数据)或如果数据量太大 如果需要将其划分为更小的块,则应使用 派生类的GetDecoder方法返回的Decoder对象


您正在犯传统的程序员错误,每个人都必须犯一次错误才能学会如何避免错误并正确操作。这主要是因为编写调试代码时出现了错误,这使得发现错误变得更加困难:

  • 永远不要编写使用MessageBox.Show()的调试代码。这是一个非常非常邪恶的函数,它会导致重入。昂贵的词意味着它只冻结用户界面,而不会冻结您的程序。它继续运行,可能出现错误的一点是,您发布的代码会再次执行。重新输入。您将看到两个消息框。并且您将拥有一个完整的c程序状态被破坏,因为您的代码从未被编写为假定可以重新输入。这就是为什么您抱怨4字节的数据被吞没的原因
这里使用的合适工具是真正冻结程序的功能。调试器断点


  • 永远不要假设二进制数据可以转换为文本。您收到的这4个字节包含二进制零。它没有字符。更糟糕的是,它充当许多操作系统调用的字符串终止符,调试器、Debug.WriteLine()等使用的那种。这就是为什么您看不到“您正在犯传统的程序员错误,每个人都必须犯一次错误,才能学会如何避免错误并正确操作。这主要是因为编写调试代码时出现了错误,这使得发现错误变得更加困难:

    • 永远不要编写使用MessageBox.Show()的调试代码。这是一个非常非常邪恶的函数,它会导致重入。昂贵的词意味着它只冻结用户界面,而不会冻结您的程序。它继续运行,可能出现错误的一点是,您发布的代码会再次执行。重新输入。您将看到两个消息框。并且您将拥有一个完整的c程序状态被破坏,因为您的代码从未被编写为假定可以重新输入。这就是为什么您抱怨4字节的数据被吞没的原因
    这里使用的合适工具是真正冻结程序的功能。调试器断点


    • 永远不要假设二进制数据可以转换为文本。您收到的这4个字节包含二进制零。它没有字符。更糟糕的是,它充当许多操作系统调用的字符串终止符,调试器、Debug.WriteLine()等使用的那种。这就是为什么您看不到“问题是我启动了getMessage void 2次。这启动了while 2次(在不同的线程中)


      Elgonzo帮我找到了问题,他是一个很棒的人:)

      问题是我启动了getMessage void两次。这启动了while两次(在不同的线程中)


      Elgonzo帮我找到了问题,他是一个很棒的人:)

      lengthBytes包含什么?为什么要尝试使用编码将它们转换为文本?起初它是空的,但我正在用NetworkStream将数据放入其中。Read()函数。我正试图将其转换为文本以便查看结果,这更多是为了调试目的,因为这不是我真正的问题。“真实”代码是否围绕您显示的代码段循环?是的,但如果我将MessageBox.show(“Hello”);与之一起,它只显示一次。循环执行以下操作:while(true){获取长度为4个字节;length=decode(4字节);获取(长度)字节,实际的消息。这给出了一个错误,因为消息的前4个字节已经被读取。嗯……那么——为了测试/故障排除——为什么不尝试读取服务器发送的第一个,比如说,16个字节的数据,并在您的问题中显示这些原始字节数据。了解原始字节数据是…什么是
      lengthBytes
      包含的?为什么要尝试使用编码将它们转换为文本?起初它是空的,但我使用NetworkStream.Read()函数将数据放入其中。我试图将其转换为文本以便查看结果,这更多是为了调试目的,因为这不是我真正的问题“真实的”代码循环围绕您显示的代码段?是的,但是如果我将MessageBox.show(“Hello”);放在一起,它只显示一次。循环执行以下操作:while(true){get 4 bytes with length;length=decode(4 bytes);get(length)字节,实际的消息。这给出了一个错误,因为消息的前4个字节已经被读取。嗯……那么——为了测试/故障排除——为什么不尝试读取服务器发送的第一个,比如说,16个字节的数据,并在您的问题中显示这些原始字节数据。了解原始字节数据是…嗯,如果我不使用任何编码.UTF8.GetString,它仍然得到8个字节(4个字节太多),如果我想得到其余的字节,这会导致错误,因为缺少4个字节。H
      byte[] lengthBytes = new byte[4];
      serverStream.Read(lengthBytes, 0, 4);
      MessageBox.Show("'>>" + System.Text.Encoding.UTF8.GetString(lengthBytes) + "<<'");
      MessageBox.Show("Hello");
      
      Msgbox 1: '>>/   (Note that this is still 4 characters long, the last 3 bytes are null.
      Msgbox 2: '>>{"ac<<'
      Msgbox 3: Hello