2013-12-23 96 views
1

我知道我可以一個字節數組轉換爲int數組有以下:轉換爲字節數組爲int數組填充

int[] bytesAsInts = yourBytes.Select(x => (int)x).ToArray(); 

我如何轉換一個字節數組到一個固定大小的int數組並用0x00填充其餘部分?

例如,我的字節數組是10個字節,我想創建長度爲14的int數組的代碼應該轉換爲10個字節我的字節數組,並墊其餘4 0x00

回答

4

寫自己可重複使用的擴展方法,可以墊一個序列:

static IEnumerable<T> AppendPadding(this IEnumerable<T> items, int totalCount, T paddingItem) { 
int count = 0; 
foreach (var item in items) { 
    yield return item; 
    count++; 
} 

for (int i = count; i < totalCount; i++) 
    yield return paddingItem; 
} 

而且使用這樣的:

int[] bytesAsInts = yourBytes.Select(x => (int)x).AppendPadding(14, 0).ToArray(); 

這適用於任何類型的序列與罪gle線性遍歷序列。它也很懶。抽象化填充序列的問題可以消除主算法中填充的複雜性。它現在隱藏在其他沒有人關心的地方。分解不重要的細節導致乾淨的代碼,因爲所有的複雜性都隱藏在一個定義良好的界面之後。

1
int[] array = new int[14]; 
bytesAsInts.CopyTo(array, 4); 
+0

這很有吸引力(快),但你沒有做填充(調零)和填充最後10個,而不是第一個。 –

+0

你的權利,但int無論如何將有價值0。或者我錯過了什麼? – garf1eld

+0

@陣列的@HenkHolterman尾部將填充零。在C#中,獲取未初始化的數組並不簡單,我認爲... –

1

也許不是最可讀的,但oneliner :)

int[] bytesAsInts = yourBytes.Select(x => (int)x) 
     .Concat(Enumerable.Repeat(0,14-yourBytes.Length)).ToArray(); 
0

@usr肯定有一個偉大的答案。這是另一種方式,並不健壯。但是解釋了對任何語言都有用的邏輯,它們以自己的方式實現。這裏可以通過輸入來設置desiredSize

int desiredSize = 14; 
int[] myArray = new int[desiredSize ]; 
for(int i = 0; i < myArray.Length; i++) 
{ 
    if(i <= yourBytes.Length) 
     myArray[i] = (int)yourBytes[i]; 
    else 
     myArray[i] = 0x00; 
}