从网络流中获取所有字节.读入单字节数组



我有一个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)

最新更新