到目前为止,我已经有了一个使用ReadBytes()读入所有字节的函数。 我想全部使用数据并将其添加到我的'arrfile',这是一个byte []。
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'这是一个byte []?
答案 0 :(得分:1)
对您的问题的快速,低效的回答是,您可以在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
method无法保证在第一次尝试时读取您请求它读取的所有字节。它将读取至少一个字节且不超过您在第三个参数中指定的字节数,除非它位于流的末尾,在这种情况下它将读取零字节。
另请注意,我在FileStream
周围添加了一条使用声明。您在Close
上调用了FileStream
方法,这很好,除非在到达该点之前抛出异常时不会调用它。 using语句有效地做了同样的事情,但是即使抛出异常也会确保流被关闭。
答案 1 :(得分:0)
你可以通过
来做arrfile[i] = b;
但不要那样做。使用直接读入字节数组的FileStream.Read()。
由于您似乎正在尝试阅读WAV文件标题,您甚至应该考虑另一种方法:
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;
}
答案 2 :(得分:0)
感谢所有答案,我使用了它:
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;
}