将所有值存储到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"中?

将所有值存储到FileStream.ReadBytes()中的一个字节[]中

问题的快速、低效答案是,您可以在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文件头,你甚至应该考虑另一种方法:

  1. 定义一个与wave标头匹配的结构
  2. 读取结构的依据
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;
}