C#,如何将字节数组减半?

时间:2010-03-31 16:15:48

标签: c#

我有一个像这样定义的字节数组

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

如何获取fileContents字节数组的前1/2?

换句话说,如果数组的上限是10,我希望新的字节数组具有fileContents的前5个值。

提前致谢

7 个答案:

答案 0 :(得分:7)

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

答案 1 :(得分:6)

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

最好只在第一时间阅读上半部分。

答案 2 :(得分:5)

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

答案 3 :(得分:5)

为什么不从文件中顺序读取字节?你只能读一半。你做了不必要的操作。

答案 4 :(得分: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);
}

最诚挚的问候,
Oliver Hanappi

答案 5 :(得分: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无法保证每次读取您要求的所有数据这一事实。

答案 6 :(得分:0)

你可以做到

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

如果您首先不需要fileContents,则可以使用FileStream和BinaryReader,并只读取该文件的一半。