将所有值从 FileStream.ReadBytes() 存储到 byte[]
Store all values to an byte[] from a FileStream.ReadBytes()
到目前为止,我已经得到一个使用 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' 中,即一个字节 [],使用循环?
你会通过
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;
}
对您的问题的快速、低效的回答是,您可以在 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
周围放置了一个 using 语句。您在 FileStream
上调用了 Close
方法,这很好,但如果在到达该点之前抛出异常则不会调用它。 using 语句实际上做同样的事情,但即使抛出异常也会确保流关闭。
感谢所有的回答,我使用了它:
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;
}
到目前为止,我已经得到一个使用 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' 中,即一个字节 [],使用循环?
你会通过
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;
}
对您的问题的快速、低效的回答是,您可以在 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
周围放置了一个 using 语句。您在 FileStream
上调用了 Close
方法,这很好,但如果在到达该点之前抛出异常则不会调用它。 using 语句实际上做同样的事情,但即使抛出异常也会确保流关闭。
感谢所有的回答,我使用了它:
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;
}