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

C#,如何将字节数组减半?,c#,C#,我有一个这样定义的字节数组 byte[] fileContents = File.ReadAllBytes(zfoFileName); 如何获取fileContents字节数组的前1/2 换句话说,如果数组的上限是10,我希望一个新的字节数组具有fileContents的前5个值 提前感谢为什么不从文件中按顺序读取字节?你只能读一半。你做了不必要的操作 为什么不从文件中按顺序读取字节?你只能读一半。你做了不必要的操作 var firstHalf = fileContents.Take(file

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

byte[] fileContents = File.ReadAllBytes(zfoFileName);
如何获取fileContents字节数组的前1/2

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


提前感谢

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

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

var firstHalf = fileContents.Take(fileContents.Length / 2).ToArray();
Array.Resize(ref fileContents, fileContents.Length / 2);
不过,最好还是先看前半部分

不过,最好先看前半部分。

你可以这样做

byte[] halfFileContents = new byte[Math.Floor(filecontents.Length / 2)];
Arra.Copy(fileContents, halfFileContents, halfFileContents.Lenght);
如果您首先不需要文件内容,可以使用FileStream和BinaryReader,只将文件的一半读入数组。

您可以这样做

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

如果您首先不需要文件内容,可以使用FileStream和BinaryReader,只将文件的一半读入数组。

使用LINQ或数组类可以轻松做到这一点:

var half = fileContents.Take(fileContents.Length / 2);
// ---
var half = new byte[fileContents.Length / 2];
Array.Copy(fileContents, half, fileContents.Length / 2)
但是您更应该从文件流中手动读取数据,因为使用上面的代码,您可以从文件中读取所有数据,即使您只需要其中的一半

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

使用LINQ或Array类,您可以轻松做到这一点:

var half = fileContents.Take(fileContents.Length / 2);
// ---
var half = new byte[fileContents.Length / 2];
Array.Copy(fileContents, half, fileContents.Length / 2)
但是您更应该从文件流中手动读取数据,因为使用上面的代码,您可以从文件中读取所有数据,即使您只需要其中的一半

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)

这里有一种更正确的方法,可以将半个文件读入一个
字节[]

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
不能保证每次都能读取您要求的所有数据。

这里有一种更正确的方法,可以将半个文件读入一个
字节[]

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不能保证每次都能读取您要求的所有数据。

@Jason这是一个非常好的问题听起来您想使用缓冲区读取,ReadAllBytes应该只在您想的时候使用,嗯,通读Bytes@Jason这是一个非常好的问题听起来你想用缓冲区读取,ReadAllBytes应该只在你想,嗯,好吧,按测试读取所有字节时使用这可能是我能想到的最昂贵的方式。。。提议的10字节没问题,但是10MB?马克:我喜欢你的方式,这是我想到的第一件事。正要查找数组方法时,其他所有人都出现了。虽然我相信你能想出一个更贵的方法。更贵?需要更多的xml-这可能是我能想到的最昂贵的方式。。。提议的10字节没问题,但是10MB?马克:我喜欢你的方式,这是我想到的第一件事。正要查找数组方法时,其他所有人都出现了。虽然我相信你能想出一个更贵的方法。更贵?需要更多的xml-当我读到这个问题时,他想要一个有一半字节的新数组。@Brian-这正是它所做的(因此
ref
)。毕竟,不能真正调整数组的大小。他没有说任何关于新变量的事……好吧,很公平。我想你可以用任何一种方式来阅读。我的印象是他也想要一个新的变量,但希望他能澄清。无论如何,调整大小对我来说是一个很好的选择,所以+1。当我读到这个问题时,他想要一个新的具有一半字节的数组。@Brian-这正是它所做的(因此
ref
)。毕竟,不能真正调整数组的大小。他没有说任何关于新变量的事……好吧,很公平。我想你可以用任何一种方式来阅读。我的印象是他也想要一个新的变量,但希望他能澄清。无论如何,调整大小是一个很好的选择,所以我认为+1。
.Length/2
是整数算术。不需要
Floor
,它将返回
double
float
,并且不能使用
新字节[]
长度/2
是整数算术。不需要
Floor
,这将返回
double
float
,并且不能使用
新字节[]