Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/23.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
编码.ASCII.GetString()问题VB.NET_.net_Vb.net_Sockets_Encoding_Network Programming - Fatal编程技术网

编码.ASCII.GetString()问题VB.NET

编码.ASCII.GetString()问题VB.NET,.net,vb.net,sockets,encoding,network-programming,.net,Vb.net,Sockets,Encoding,Network Programming,从networkstream接收从字节转换为字符串的数据时出现问题。。输出应该是相同的,但是当我将Encoding.ASCII.GetString()生成的字符串与实际字符串进行比较时,输出是不同的 这是我的密码 服务器: Dim tcp As New TcpClient tcp = findTCP(ip) Dim ns As NetworkStream = tcp.GetStream Dim b As [Byte]() = Encoding.ASCII.GetBytes("a") ns.Wri

从networkstream接收从字节转换为字符串的数据时出现问题。。输出应该是相同的,但是当我将Encoding.ASCII.GetString()生成的字符串与实际字符串进行比较时,输出是不同的

这是我的密码

服务器:

Dim tcp As New TcpClient
tcp = findTCP(ip)
Dim ns As NetworkStream = tcp.GetStream
Dim b As [Byte]() = Encoding.ASCII.GetBytes("a")
ns.Write(b, 0, b.Length)
Dim bb(tcp.ReceiveBufferSize) As Byte
ns.Read(bb, 0, tcp.ReceiveBufferSize)
If Encoding.ASCII.GetString(bb) = "b" Then
    a = "conn"
Else
    a = "not"
End If
客户:

Dim ns As NetworkStream = socClient.GetStream
Dim b(socClient.ReceiveBufferSize) As Byte
ns.Read(b, 0, socClient.ReceiveBufferSize)

Dim bb As [Byte]() = Encoding.ASCII.GetBytes("b")
ns.Write(bb, 0, bb.Length)
仅用于ping目的:)

我的服务器ping到客户端


是否有任何实例表明,当字符串转换为字节时,字符串将发生更改?:

您的字节数组声明太大。这会导致字符串有额外的附加字符,这会干扰字符串比较逻辑

ReceivedBufferSize是套接字内部的缓冲区大小,其值通常在2.000-8000字节之间。您应该改为使用Available属性,该属性指示当前接收的字节数

Dim bb(tcp.Available) As Byte

您的字节数组声明太大。这会导致字符串有额外的附加字符,这会干扰字符串比较逻辑

ReceivedBufferSize是套接字内部的缓冲区大小,其值通常在2.000-8000字节之间。您应该改为使用Available属性,该属性指示当前接收的字节数

Dim bb(tcp.Available) As Byte

您忽略了
Read
方法的返回值,该方法将告诉您它实际读取了多少字节。之后缓冲区中的所有内容都是垃圾。它还会告诉您是否已经读取了所有流,因此您不知道是否读取了所有数据,或者有多少数据

使用
Read
方法的返回值来确定您得到了什么,以及是否需要再次调用它。假设1000字节的数组足以容纳流,则该操作应该可以:

Dim bb(999) As Byte
Dim pos As Integer = 0
Dim len As Integer
Do
  len = ns.Read(bb, pos, bb.Length - pos)
  pos += len
Loop While len > 0
解码数据时还需要使用该长度,否则将解码整个缓冲区,包括实际数据后的垃圾:

Encoding.ASCII.GetString(bb, 0, len)

您忽略了
Read
方法的返回值,该方法将告诉您它实际读取了多少字节。之后缓冲区中的所有内容都是垃圾。它还会告诉您是否已经读取了所有流,因此您不知道是否读取了所有数据,或者有多少数据

使用
Read
方法的返回值来确定您得到了什么,以及是否需要再次调用它。假设1000字节的数组足以容纳流,则该操作应该可以:

Dim bb(999) As Byte
Dim pos As Integer = 0
Dim len As Integer
Do
  len = ns.Read(bb, pos, bb.Length - pos)
  pos += len
Loop While len > 0
解码数据时还需要使用该长度,否则将解码整个缓冲区,包括实际数据后的垃圾:

Encoding.ASCII.GetString(bb, 0, len)

您是否调试了应用程序以查看字节数组/字符串的实际值?通过将字符串转换为字节并再次转换回来,字符串不会更改。mmm。。我正在做的是msgbox Encoding.ASCII.GetString(bb)您调试过应用程序以查看字节数组/字符串的实际值是多少吗?通过将字符串转换为字节并再次转换回来,字符串不会更改。mmm。。我所做的是msgbox Encoding.ASCII.GetString(bb)我将其更改为Dim bb(10024)作为字节,但仍然不是相同的字符串尝试将其更改为Dim bb(tcp.ReceiveBufferSize-1)作为Bytestill不一样。。我甚至试着用修剪。。无论如何,我如何在字节数组中查看整个数据..在行上设置一个断点,然后将鼠标悬停在数组变量上。我的错是,您不应该使用ReceiveBufferSize,但它可用。我将其更改为Dim bb(10024)作为byte,但仍然不是相同的字符串尝试将其更改为Dim bb(tcp.ReceiveBufferSize-1)作为Bytestill不一样。。我甚至试着用修剪。。无论如何,我怎样才能在字节数组中看到整个数据..在行上设置一个断点,然后将鼠标悬停在数组变量上.我的错,你不应该使用ReceiveBufferSize,但可以使用。