我有一台基于规格的TCP服务器(线扫描相机)向我发送图像数据。图像数据是1D字节阵列的形式。摄像机发送的字节数是已知的,但它可以根据规范而变化,因此有时它会是一个非常大的数字,有时是一个很小的数字。我正在使用Networkstream.Read获取字节并尝试将其存储到数组中。
问题是它发送给我包。我需要一种方法,将从流发送的所有数据存储在单个字节数组中,然后我可以使用它并将其转换为图像。
这是我现在使用的代码。我还是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的长度在上次读取时不会更改。有没有办法可以将流中的所有数据存储在单字节数组中?服务器发送的字节大小通过以下方式获得:(numberOfLines * numberOfColumns)
更新#2:工作代码
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
答案 0 :(得分:0)
由于TCP是基于流的协议,因此确保将所有预期数据(整个“消息”)放入单个数组的唯一方法是继续调用In [234]: df
Out[234]:
T1 T2 T3 id
date_time
2001-01-01 00:00:00 1.0 2.0 3.0 3
2001-01-01 02:00:00 1.2 2.2 NaN 3
2001-01-01 03:00:00 1.3 2.3 3.3 3
,直到您读取足够数量的字节。
我尝试将数据存储到数组中,然后附加它们,但VB不提供该功能。
事实并非如此。有几种方法可以连接数据块。例如,您可以使用List(Of T)
。
然而,在你的情况下,答案实际上就在你的鼻子底下。如果您查看NetworkStream.Read()
documentation,可以看到第二个参数(称为NetworkStream.Read()
)指定“offset
中开始存储数据的位置” - 其中buffer
是您指定为第一个参数的字节数组。
如果给buffer
参数指定已读取的字节数,它将在已接收的字节之后追加数组中的新字节。另外请记住,如果你接近数组末尾,你不想读太多。
offset