2010-03-31 139 views
1

我已經定義了這樣的C#中如何減半字節數組?

byte[] fileContents = File.ReadAllBytes(zfoFileName); 

一個字節數組,我怎樣才能獲得fileContents字節數組的第一個1/2?

換句話說,如果數組的上限是10,我想要一個新的字節數組擁有fileContents的前5個值。

在此先感謝

+0

如果長度很奇怪怎麼辦? – 2010-03-31 16:18:53

+0

@Jason這是一個非常好的問題 – 2010-03-31 16:20:25

+1

聽起來像你想使用緩衝區讀取,ReadAllBytes應該只用於當你想,很好,閱讀所有字節 – 2010-03-31 16:22:56

回答

5
var firstHalf = fileContents.Take(fileContents.Length/2).ToArray(); 
+2

這可能是我能想到的最昂貴的方式..爲建議的10個字節罰款,但爲10MB? – 2010-03-31 16:21:04

+0

@Marc:我喜歡你的方式,這是我想到的第一件事。當其他人彈出時,要查找Array方法。雖然我相信你可以想到更昂貴的方式。 – 2010-03-31 16:22:16

+0

更貴?需要更多的XML ...... ;-p – 2010-03-31 16:25:19

7
​​
+0

+1比LINQ這個要快得多。 – 2010-03-31 16:21:53

5

爲什麼不按順序從文件中讀取字節?你只能讀一半。你做不需要的操作。

6
Array.Resize(ref fileContents, fileContents.Length/2); 

儘管如此,只能讀取前半部分。

+1

當我讀到這個問題時,他想要一個半字節的新數組。 – 2010-03-31 16:22:10

+1

@布萊恩 - 這是*正是*做了什麼(因此'參考')。畢竟,你真的不能*調整數組的大小。他沒有提及任何有關新變量* ... – 2010-03-31 16:23:39

+0

好吧,夠公平的。我想你可以閱讀它的任何方式。我的印象是,他想要一個新的變量,但希望他能澄清。無論如何,調整大小是一個很好的選擇,所以+1。 – 2010-03-31 16:28:27

0

你可以做

byte[] halfFileContents = new byte[Math.Floor(filecontents.Length/2)]; 
Arra.Copy(fileContents, halfFileContents, halfFileContents.Lenght); 

如果您並不需要擺在首位fileContents,你可以使用的FileStream和BinaryReader在和只讀文件的半到數組。

+1

'.Length/2'是整數運算。不需要'Floor',它會返回'double'或'float',並且不能使用'new byte []'。 – 2010-03-31 16:22:56

3

你可以用LINQ或Array類很容易地做到這一點:

var half = fileContents.Take(fileContents.Length/2); 
// --- 
var half = new byte[fileContents.Length/2]; 
Array.Copy(fileContents, half, fileContents.Length/2) 

但是你應該寧可去從一個FileStream手動讀取數據,因爲有你,即使你的文件中讀取的所有數據上的代碼只需要一半。

using (var stream = new FileStream(filename, FileMode.Open, FileAccess.Read, FileShare.Read)) 
using (var reader = new BinaryReader(stream)) 
{ 
    var half = reader.ReadBytes(stream.Length/2); 
} 

最好的問候,
奧利弗Hanappi

2

這裏是看了半個多文件到一個單一的byte[]一個比較正確的做法:

byte[] data; 
using (FileStream fs = File.OpenRead(zfoFileName)) { 
    int len = (int)fs.Length/2, bytesRead, offset = 0; 
    data = new byte[len]; 
    while(len > 0 && (bytesRead = fs.Read(data, offset, len)) > 0) { 
     len -= bytesRead; 
     offset += bytesRead; 
    } 
    if (len > 0) throw new EndOfStreamException(); 
} 
// now look at data 

總之,它只是讀取一半的數據,儘可能少的操作,但迎合Stream.Read不保證每次讀取所有你要求的數據的事實。