2013-11-04 14 views
5

在C#中處理以下情況的最佳方式是什麼?C#Array.Value與C++中創建的數組有所不同

我有用C/C++編寫的服務器應用程序。

例如 它創建一個長度爲256unsigned char緩衝區。 在此緩衝區中,服務器存儲客戶端發送給它的數據。存儲之後,接收緩衝區會進行一些加密檢查。

我正在用C#編寫這個服務器的客戶端。

的問題是,服務器在256

固定長度期待緩衝器當我創建byte[]陣列內容和所述加密檢查失敗的256總長度。

我發現的原因很簡單。服務器預計長度爲256個字節的緩衝區。例如,如果消息是"Hello World",則緩衝區的其餘部分必須爲0填充。 或者,更好地解釋:字節需要是(unsigned) "204"(signed) "-52"

我認爲這是一個C/C++的概念問題/問題。

爲了解決我的問題,我正在明確設置該值。

public static byte[] GetCBuffer(this byte[] data, int len) 
{ 
    byte[] tmp = new byte[len]; 
    for(int i = 0; i < len; i++) 
     if(i < data.Length) 
      tmp[i] = data[i]; 
     else 
      tmp[i] = 204; 
    return tmp; 
} 

是否有更好的方法來處理這些藝術期望的字節?我沒有看到一些重要的東西嗎?

+0

基於此[答案](http://stackoverflow.com/a/6150310/2145211)將_初始化一個字節數組到一個特定的值,而不是默認的空值?_我會說你的解決方案是一個很好的。 – Harrison

+0

我會進一步推廣並傳入「空白」值,因此如果值不是204,那麼您可以再次重複使用。 –

回答

2

如果你不喜歡在你的代碼if,你可以嘗試LINQ:

public static byte[] GetCBuffer(this byte[] data, int len) 
{ 
    byte[] tmp = Enumerable.Repeat((byte)204, len).ToArray(); 
    for(int i = 0; i < data.Length; i++) 
    { 
     tmp[i] = data[i]; 
    } 

    return ret; 
} 

但在概念上,它是相同的,只是看起來(可以說)更好一點。

+0

您也可以用Zip代替循環,並將ToArray放在返回中。 – Magus

1

你能'memset'整個數組到所需的填充字符,然後插入實際的數據?

+1

這聽起來像是一種更易讀的結果,此外您可以在「Buffer.BlockCopy」數據之後清除它。 –

+0

你能指定你的想法嗎?如何實現memset沒有銷燬開銷?事實上,我之前已經嘗試過BlockCopy。但是元素比0填充。在處理元素時,服務器端會失敗。 – OnkelM

+0

你的帖子陳述了這個:「我有用C/C++編寫的服務器應用程序 ...它創建一個長度爲256的無符號字符緩衝區。」所以我認爲它是C/C++,它需要在數組創建時完成。 –