2013-02-19 37 views
2

我有个字节的列表:“名单(字节())”到“字节()”在VB.NET

Public Function GenPackets() 
    Dim Stream As NetworkStream = ConnectionSocket.GetStream() 
    Dim DataList As New List(Of Byte()) 
    Dim Data As Byte() 
    DataList.Add(IntegerToByte(My.Settings.BotUID)) 

    ' TO DO  Stream.Write(Data, 0, 3) 
    Return Data 
End Function 

我如何转换DataList及其所有字节一个字节, ()用于Stream.Write

+0

这似乎是错误的做法您的数据列表。如果你需要'Stream.Write',那么为什么不迭代列表并单独写入每个字节数组? – 2013-02-19 15:38:03

+1

Konrad的答案是正确的,如果您想写入流,则不需要将其转换为单个字节数组。但是,对于任何遇到这个问题的人来说,如何创建一个字节数组,你可以使用LINQ的'SelectMany'来完成它http://stackoverflow.com/questions/4868113/convert-listbyte-to-one-字节数组 – keyboardP 2013-02-19 15:41:46

+0

@keyboardP请你告诉我如何在vb.net中使用SelectMany? – Shahriyar 2013-02-19 15:47:31

回答

4

正如康拉德·鲁道夫已经写,你不需要压扁,以把它写入你的流数据。

为了完整起见,您可以拼合这样

Dim dataList As New List(Of Byte()) 
Dim data As Byte() 

data = dataList.SelectMany(Function(x) x).ToArray() 

或者与LINQ语法

data = (From bytes In dataList From x In bytes Select x).ToArray() 
7

无需转换数据,只是遍历列表:

For Each buffer As Byte() In Datalist 
    yourStream.Write(buffer) 
Next 

这是远远大于第一次连接所有单独的阵列来创建一个大数组更有效。

+0

感谢您的回答,但我不寻找这,这将发送多个数据包到服务器,我想加入字节列表中的所有字节,并将它们发送到一个包 – Shahriyar 2013-02-19 15:47:01

+2

@ Shahriyar我认为你误解数据包是如何工作的。数据包创建在更低层。一次写入'Write'的调用不会对应于一个数据包。写入被缓冲并根据* size *以数据包形式发送。实际上,如果您使用的是“NetworkStream”,那么每个字节将由['WriteByte'](http://msdn.microsoft.com/en-us/library/system.io.stream.writebyte .aspx)方法无论如何。 – 2013-02-19 15:49:06

+1

...除非您将基础套接字的缓冲区大小设置为0.但[默认值为8192个字节](http://msdn.microsoft.com/zh-cn/library/system.net.sockets.socket.sendbuffersize.aspx) 。 – 2013-02-19 15:56:10

1

你可以做字节的List代替阵列:

Dim DataList As New List(Of Byte) 
DataList.AddRange(IntegerToByte(My.Settings.BotUID)) 

Data = DataList.ToArray()