2011-12-30 33 views
1

我有一個函數,它將一個數組作爲參數。該函數然後用未知長度的信息填充陣列。那麼,我將如何創建一個數組來存儲未知長度的消息?因爲我不能指定數組的大小,因爲我不知道它將要存儲的消息的大小。在Visual C#中使用數組?

這是有效的嗎?

byte [] array; 
function (array); 

然後數組的大小將由它填充的消息的大小決定? 如果這是不可能的,我會怎麼做?

我需要這個數組來填充它的消息的確切大小,所以我不能只是指定數組是足夠大的隨機大小以適應消息。


另外,從評論:

public int ReceiveFrom(byte[] buffer, int offset, int size, 
     SocketFlags socketFlags, ref EndPoint remoteEP) 
+1

你不能。這就是爲什麼這樣的接口不存在於庫中。 – 2011-12-30 23:45:27

+1

@DarrenYoung:downvoting的一個合理原因是相關信息(再次)必須從註釋中提取。造成這個問題的誤解是可以原諒的,(太)太短的問題本身不是。也請看Fahrad的previosu問題。 – 2011-12-31 00:12:53

+0

@HenkHolterman 我特別沒有指定函數原型的原因: 我提到的函數不是唯一的函數給我一個問題。另外,我還有其他幾個功能給我帶來了同樣的問題。當問題如此普遍時,我不能也不會浪費時間發佈各種原型。 – fdh 2011-12-31 00:17:04

回答

2

關於使用

public int ReceiveFrom(byte[] buffer, int offset, int size, 
    SocketFlags socketFlags, ref EndPoint remoteEP) 

你應該在一個循環中使用這個。您一次收到全部消息(流)的部分內容。由你決定你需要哪個部分。可選擇將其餘部分向下移動並在下一次呼叫中指定offset

byte[] buffer = new byte[1024]; 
ínt n; 
do 
{ 
    n = ReceiveFrom(buffer, 0, buffer.Lenght, ...); 

    if (n > 0) 
     // process n bytes in buffer 

} while (n > 0); 
+0

謝謝。只有TCP套接字才需要循環,雖然對嗎?或者,這是否也適用於UDP套接字? – fdh 2011-12-31 00:11:21

+0

我不知道UDP套接字,但我很確定它以同樣的方式工作。 – 2011-12-31 00:14:27

+1

UDP是面向數據報的,不是面向數據流的。緩衝區需要足夠大以容納整個數據報(最高64 KiB)。否則數據會被截斷,並且該方法拋出一個SocketException。 – dtb 2011-12-31 00:16:37

0

你可以使用一個List代替。儘管可能,但您無需設置預定長度,並且隨着更多對象的添加,列表將會擴展。

+0

它具體必須是一個數組。 – fdh 2011-12-30 23:43:21

+0

爲什麼它必須是一個數組?你不能有一個動態數組。 – 2011-12-30 23:45:32

+0

因爲函數只接受一個數組作爲參數。此外,陣列不必是動態的 - 因爲它不必保持改變尺寸。我只需要它的初始大小由函數決定。 – fdh 2011-12-30 23:45:36

0

在將數組傳遞給填充函數之前,您需要對數組做些什麼嗎?如果你不這樣做,你爲什麼不只是返回從功能的陣列,而不是傳遞一個:

byte[] retArray = function(); 

其中功能是:

byte[] function() 
{ 
} 

你可以再找出的長度該陣列通過檢查:

if(retArray != null) 
{ 
    Console.WriteLine(retArray.Count); 
} 
3

您可以使用一個列表,然後一旦你的信息充滿呼叫ToArray

編輯

例子:

List<byte> message = new List<byte>(); 
message.Add(/*your byte*/); 
//More Adds 
function(message.ToArray()); 
+1

不會幫忙。 OP無法控制方法實現或其簽名,因此不能傳遞數組以外的任何其他數據。 – keyboardP 2011-12-30 23:54:46

+0

我現在看到了。在他評論你的答案之前,這並不明顯。 – xbrady 2011-12-31 00:01:47

+0

大家都丟了:D – keyboardP 2011-12-31 00:41:47

0

這很難說,不知道確切的細節,但你可以讓函數創建數組它知道的信息後長度。

此外,使用Linq(使用ToArrayToList),您可以從陣列和列表進行投射,但同樣,如果不知道意圖,很難分辨。