我已经定义了这样的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