将所有值存储到FileStream.ReadBytes()中的一个字节[]中
本文关键字:一个 字节 存储 FileStream ReadBytes | 更新日期: 2023-09-27 18:26:11
到目前为止,我有一个函数可以使用ReadBytes()读取所有字节。我想使用所有的数据,并将其添加到我的"arrfile"中,这是一个字节[]。
private byte[] GetWAVEData(string strWAVEPath)
{
FileStream fs = new FileStream(@strWAVEPath, FileMode.Open, FileAccess.Read);
byte[] arrfile = new byte[fs.Length - 44];
fs.Position = 4;
// fs.Read(arrfile, 0, arrfile.Length);
for (int i = 0; i < arrfile.Length; i++)
{
int b = fs.ReadByte();
}
fs.Close();
return arrfile;
}
我已经用"b"读取了fileStream中的所有字节,现在我如何使用循环将"b"的每个值放入作为字节[]的"arrfile"中?
问题的快速、低效答案是,您可以在int b = fs.ReadByte();
行下的for循环中添加以下内容:
// b will be -1 if the end of the file is reached
if (b >= 0)
{
arrfile[i] = (byte)b;
}
但是,我建议使用Read
方法将所有字节读取到数组中。一旦你把它们加载到内存中,你就可以随心所欲地操作数组中的数据
using(FileStream fs = new FileStream(@strWAVEPath, FileMode.Open, FileAccess.Read))
{
byte[] arrfile = new byte[fs.Length - 44];
fs.Position = 4;
int remainder = arrfile.Length;
int startIndex = 0;
int read;
do
{
read = fs.Read(arrfile, startIndex, remainder);
startIndex += read;
remainder -= read;
} while (remainder > 0 && read > 0);
return arrfile;
}
while循环的原因是Read
方法不能保证在第一次尝试时读取您请求它读取的所有字节。它将读取至少一个字节,但不超过您在第三个参数中指定的字节数,除非它位于流的末尾,在这种情况下,它将读取零个字节。
还要注意,我在你的FileStream
周围放了一个using语句。您在FileStream
上调用Close
方法,这很好,只是如果在到达该点之前抛出异常,则不会调用它。using语句有效地做了同样的事情,但即使抛出异常,也会确保流是关闭的。
你可以通过来完成
arrfile[i] = (byte) b; // note: -1 is a special return value
但就是不要那样做。使用FileStream.Read(),它直接读取字节数组。
既然你似乎正在尝试读取WAV文件头,你甚至应该考虑另一种方法:
- 定义一个与wave标头匹配的结构
- 读取结构的依据
T ReadStruct<T>(Stream stream)
{
var buffer = new byte[Marshal.SizeOf(typeof(T))];
stream.Read(buffer, 0, Marshal.SizeOf(typeof(T)));
var gcHandle = GCHandle.Alloc(buffer, GCHandleType.Pinned);
T result = (T)Marshal.PtrToStructure(gcHandle.AddrOfPinnedObject(), typeof(T));
gcHandle.Free();
return result;
}
感谢所有的答案,我使用
private byte[] GetWAVEData(string strWAVEPath)
{
FileStream fs = new FileStream(@strWAVEPath, FileMode.Open, FileAccess.Read);
byte[] arrfile = new byte[fs.Length - 44];
fs.Position = 44;
for (int i = 0; i < arrfile.Length; i++)
{
int b = fs.ReadByte();
byte convert = Convert.ToByte(b);
arrfile[i] = convert;
}
fs.Close();
return arrfile;
}