我有一个TCP服务器(线扫描相机),它根据规格向我发送图像数据。图像数据采用1D字节数组的形式。相机发送的字节数是已知的,但它可以根据规格而变化,所以有时它会是一个非常大的数字,有时会是一个很小的数字。我正在使用Networkstream。读取以获取字节并尝试将其存储到数组中。
问题是它以数据包的形式发送给我。我需要一种方法,从流发送的所有数据都存储在一个单字节数组中,然后我可以使用并将其转换为图像。
这是我现在一直在使用的代码。我还是VB的新手。我尝试将数据存储到数组中,然后附加它们,但不知何故VB不提供该功能。
Dim imageData(numberOfColumns * numberOfLines - 1) As Byte
Dim bytesReceived =
Dim bytesReceivedTotal = 0
Dim bytesToRcv = numberOfColumns * numberOfLines
Dim imageFragment() As Byte
Dim rcvbytes(8092) As Byte 'tried socket.receivebuffersize too
Dim readCount = 0
Do
bytesReceived = clientStream.Read(rcvbytes, 0, rcvbytes.Length)
bytesReceivedTotal += bytesReceived
rcvbytes.CopyTo(imageData, (bytesReceivedTotal - bytesReceived))
Loop Until bytesReceivedTotal = bytesToRcv
这段代码的问题是rcvbytes的长度在最后一次读取时不会改变。有没有一种方法,我可以存储所有的数据从一个单字节数组流?(numberolines * numberOfColumns)
更新#2:WORKING CODE
Do
Dim bytesWanted As Integer = bytesReceivedTotal + 8092
Dim bytesToRead As Integer = If(bytesWanted > imageData.Length, imageData.Length - bytesReceivedTotal, 8092)
bytesReceived = clientStream.Read(imageData, bytesReceivedTotal, bytesToRead)
bytesReceivedTotal += bytesReceived
Loop Until bytesReceivedTotal = bytesToRcv
由于TCP是基于流的协议,因此将所有预期数据(整个"消息")放入单个数组的唯一方法是不断调用NetworkStream.Read()
,直到您读取了足够数量的字节。
我尝试将数据存储到数组中,然后附加它们,但不知何故VB不提供该功能。
那不是真的。有几种方法可以连接数据块。例如,您可以使用 List(Of T)
。
然而,在你的情况下,答案实际上就在你的鼻子底下。如果您查看 NetworkStream.Read()
文档,您可以看到第二个参数(称为offset
)指定"在buffer
中开始存储数据的位置" -其中buffer
是您指定为第一个参数的字节数组。
如果你给offset
参数已经读取的字节数,它将在数组中已经接收到的字节之后附加新的字节。还要记住,如果你接近数组的末尾,你不希望读取太多。
Dim bytesWanted As Integer = bytesReceivedTotal + 8092
Dim bytesToRead As Integer = If(bytesWanted > imageData.Length, imageData.Length - bytesReceivedTotal, 8092)
clientStream.Read(imageData, bytesReceivedTotal, bytesToRead)