编码.ASCII.GetString()问题VB.NET
从networkstream接收从字节转换为字符串的数据时出现问题。。输出应该是相同的,但是当我将Encoding.ASCII.GetString()生成的字符串与实际字符串进行比较时,输出是不同的 这是我的密码 服务器:编码.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
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,但可以使用。