将所有值存储到FileStream.ReadBytes()中的byte []

时间:2015-12-07 21:42:01

标签: c# arrays bytearray filestream wav

到目前为止,我已经有了一个使用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 []?

3 个答案:

答案 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文件标题,您甚至应该考虑另一种方法:

  1. 定义与wave标头匹配的结构
  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;
    }
    

答案 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;
}