如何在C#中将2字节数组写入文件?

时间:2016-01-19 15:13:18

标签: c# arrays savefiledialog

我有两个来自我自己创建的zip程序的数组,farArray和bytes。它们都是字节数组。

现在我想将其保存在文件中(例如:“file.zip”)。我知道我可以用这段代码写字节:

File.WriteAllBytes(savefile.FileName, bytes);

但我现在只保存一个byteArray。如何保存其中两个?

如果我在脚本中打开文件,我可以取回两个数组吗?

3 个答案:

答案 0 :(得分:2)

合并两个数组,然后执行写操作:

byte[] array1; // This will be the array1
byte[] array2; // This will be the array1
byte[] combinedArray = new byte[array1.Length + array2.Length ];
Array.Copy(array1, 0, combinedArray, 0, array1.Length);
Array.Copy(array2, 0, combinedArray, array1.Length, array2.Length);

现在combinedArray是一个字节数组,包含来自array1和array2的所有字节。所以编写这个数组会得到结果:

File.WriteAllBytes(savefile.FileName, combinedArray);

答案 1 :(得分:1)

如果我理解你的话:

using (var stream = new FileStream(savefile.FileName, FileMode.Append))
{
  stream.Write(bytes, 0, bytes.Length);
  stream.Write(farArray, 0, farArray.Length);
}

如果要取回阵列,可以使用结构化文件格式。例如JSON。或者在数组之间设置一些标签。或者在文件头部写入数组大小,然后使用这些数据来获取数组。

答案 2 :(得分:1)

所以你想把两个数组写入一个文件。您可以将两个数组连接成一个数组并编写它(类似于不幸的答案),或者您可以在两个单独的操作中编写数组(如fryday的回答)。这两种方法都是非常有效的方法。虽然组合数组只是为了将其写入文件,但显然效率不高。

当你想要回读那些数据时,你会遇到更大的问题。当你去阅读它时,它看起来就像一个大阵列。你怎么知道一个阵列结束而另一个阵列开始?

有几种方法可以考虑处理它。如果阵列具有已知的,固定的大小,那么它并不是那么大的交易。例如,如果你知道bytes总是100字节长而farArray总是200字节长(例如)那么你可以这样读它:

 var bytes = new byte[100];
 var farArray = new byte[200];
 stream.Read(bytes, 0, 100);
 stream.Read(farArray, 0, 200);

易。现在,如果你的阵列没有固定的长度。那么最简单的解决方案可能是在文件的开头包含一个标题,该标题将包含两个数组的长度。所以当你写作时,你会做类似的事情:

 stream.Write(BitConverter.GetBytes(bytes.Length), 0, 4);
 stream.Write(BitConverter.GetBytes(farArray.Length), 0, 4);
 stream.Write(bytes, 0, bytes.Length);
 stream.Write(farArray, 0, farArray.Length);

现在,文件的前8个字节(两个Int32' s)将包含后面两个数组的长度。所以要读你做的事情:

 var byteLengthArray = new byte[4];
 var farLengthArray = new byte[4];
 stream.Read(byteLengthArray, 0, 4);
 stream.Read(farLengthArray, 0, 4);
 // Note: you may have to worry about endianness if a file is written 
 // with one architecture and read with another.
 var byteLength = BitConverter.ToInt32(byteLengthArray, 0);
 var farLength = BitConverter.ToInt32(farLengthArray, 0);
 // now we know how big the two arrays are!
 var bytes = new byte[byteLength];
 var farArray = new byte[farLength];
 stream.Read(bytes, 0, byteLength);
 stream.Read(farArray, 0, farLength);

另一种可以做到这一点的方法,虽然它会使读取更加繁琐,但是在两个数组之间包含一些字节或字节组作为分隔符。为此,必须确保分隔符不会出现在任何一个数组中的任何其他位置。所以你写了类似的东西:

 stream.Write(bytes, 0, bytes.Length);
 stream.Write(delimiter, 0, delimiter.Length);
 stream.Write(farArray, 0, farArray.Length);

现在阅读这个有点棘手。可能最简单的方法是读取所有字节,然后搜索分隔符字符串。一旦找到分隔符开始的位置(索引),就会将它前面的所有字节复制到bytes,并将所有字节(考虑到分隔符数组的长度)复制到farArray

当然,避免所有这些棘手且容易出错的字节复制的简单方法是使用框架提供的序列化和反序列化工具。除非你有充分的理由(例如你需要你的文件超紧凑),你可能不应该发明自己的文件格式。