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
,并且不能使用新字节[]
。