2013-02-19 62 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()