2010-03-31 45 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不保证每次读取所有你要求的数据的事实。