我已經定義了這樣的C#中如何減半字節數組?
byte[] fileContents = File.ReadAllBytes(zfoFileName);
一個字節數組,我怎樣才能獲得fileContents字節數組的第一個1/2?
換句話說,如果數組的上限是10,我想要一個新的字節數組擁有fileContents的前5個值。
在此先感謝
我已經定義了這樣的C#中如何減半字節數組?
byte[] fileContents = File.ReadAllBytes(zfoFileName);
一個字節數組,我怎樣才能獲得fileContents字節數組的第一個1/2?
換句話說,如果數組的上限是10,我想要一個新的字節數組擁有fileContents的前5個值。
在此先感謝
var firstHalf = fileContents.Take(fileContents.Length/2).ToArray();
這可能是我能想到的最昂貴的方式..爲建議的10個字節罰款,但爲10MB? – 2010-03-31 16:21:04
@Marc:我喜歡你的方式,這是我想到的第一件事。當其他人彈出時,要查找Array方法。雖然我相信你可以想到更昂貴的方式。 – 2010-03-31 16:22:16
更貴?需要更多的XML ...... ;-p – 2010-03-31 16:25:19
+1比LINQ這個要快得多。 – 2010-03-31 16:21:53
爲什麼不按順序從文件中讀取字節?你只能讀一半。你做不需要的操作。
Array.Resize(ref fileContents, fileContents.Length/2);
儘管如此,只能讀取前半部分。
當我讀到這個問題時,他想要一個半字節的新數組。 – 2010-03-31 16:22:10
@布萊恩 - 這是*正是*做了什麼(因此'參考')。畢竟,你真的不能*調整數組的大小。他沒有提及任何有關新變量* ... – 2010-03-31 16:23:39
好吧,夠公平的。我想你可以閱讀它的任何方式。我的印象是,他想要一個新的變量,但希望他能澄清。無論如何,調整大小是一個很好的選擇,所以+1。 – 2010-03-31 16:28:27
你可以做
byte[] halfFileContents = new byte[Math.Floor(filecontents.Length/2)];
Arra.Copy(fileContents, halfFileContents, halfFileContents.Lenght);
如果您並不需要擺在首位fileContents,你可以使用的FileStream和BinaryReader在和只讀文件的半到數組。
'.Length/2'是整數運算。不需要'Floor',它會返回'double'或'float',並且不能使用'new byte []'。 – 2010-03-31 16:22:56
你可以用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
這裏是看了半個多文件到一個單一的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
不保證每次讀取所有你要求的數據的事實。
如果長度很奇怪怎麼辦? – 2010-03-31 16:18:53
@Jason這是一個非常好的問題 – 2010-03-31 16:20:25
聽起來像你想使用緩衝區讀取,ReadAllBytes應該只用於當你想,很好,閱讀所有字節 – 2010-03-31 16:22:56