2013-02-19 3 views
2

У меня есть список байт:'List (Of Byte())' до 'Byte()' в 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', то почему бы не перебрать список и написать каждый массив байтов отдельно? –

+1

Ответ Konrad верен, что вам не нужно преобразовывать его в один байтовый массив, если вы хотите писать в поток. Но для тех, кто сталкивается с этим вопросом, чтобы узнать, как создать один байт-массив, вы можете использовать LINQ 'SelectMany', чтобы сделать это http://stackoverflow.com/questions/4868113/convert-listbyte-to-one- byte-array – keyboardP

+0

@keyboardP вы могли бы показать мне, как использовать SelectMany в vb.net? – Shahriyar

ответ

4

Как Konrad Rudolph уже писал, что вам не нужно, чтобы сгладить данные для того, чтобы записать его на поток.

Для полноты картины можно расплющить список данных, как этот

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

+2

@ Shahriyar Я думаю, вы неправильно понимаете, как работают пакеты. Пакеты создаются на гораздо более низком уровне. Один вызов 'Write' does * not * соответствует одному пакету. Записи буферизуются и отправляются в пакетах в зависимости от * size *. Фактически, если вы используете «NetworkStream», каждый байт будет написан отдельно ['WriteByte'] (http://msdn.microsoft.com/en-us/library/system.io.stream.writebyte .aspx) независимо от того, что. –

+1

... если вы не установили размер буфера базового сокета равным 0. Но [по умолчанию 8192 байта] (http://msdn.microsoft.com/en-us/library/system.net.sockets.socket.sendbuffersize.aspx) , –

1

Вы могли бы сделать List байт вместо массивов:

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

Data = DataList.ToArray()