将所有值从 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 文件头,您甚至应该考虑另一种方法:

  1. 定义一个匹配波头的结构
  2. 通过
  3. 读取结构
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;
}