コード例 #1
0
        async Task <List <CQRiffList> > FindRiffRoot(Stream stream, byte[] find_header, long begin, long end)
        {
            stream.Position = begin;
            List <CQRiffList> riffs = new List <CQRiffList>();

            byte[] header = new byte[4];
            while (stream.Position <= end)
            {
                int readlen = await stream.ReadAsync(header, 0, header.Length);

                var bb = header.Except(this.m_Riff);
                var cc = header.Except(this.m_List);
                if (bb.Count() == 0 || cc.Count() == 0)
                {
                    CQRiffList riff = new CQRiffList();
                    riff.Pos = stream.Position - 4;
                    riff.Tag = Encoding.UTF8.GetString(header);
                    readlen  = await stream.ReadAsync(header, 0, header.Length);

                    riff.Size = BitConverter.ToInt32(header, 0);
                    readlen   = await stream.ReadAsync(header, 0, header.Length);

                    riff.Name  = Encoding.UTF8.GetString(header);
                    riff.Datas = new ObservableCollection <CQRiffList>();
                    riffs.Add(riff);
                    stream.Position = stream.Position + riff.Size - 4;
                }
                else
                {
                    CQRiffList riff = new CQRiffList();
                    riff.Tag = Encoding.UTF8.GetString(header);
                    readlen  = await stream.ReadAsync(header, 0, header.Length);

                    riff.Size = BitConverter.ToInt32(header, 0);
                    if (riff.Size < 0)
                    {
                        break;
                    }
                    stream.Position = stream.Position + riff.Size;
                    if (stream.Position < stream.Length)
                    {
                        riffs.Add(riff);
                    }
                }
            }

            return(riffs);
        }
コード例 #2
0
        public bool Open(Stream stream)
        {
            List <CQRiffList> riffs_tree = new List <CQRiffList>();
            List <CQRiffList> riffs      = new List <CQRiffList>();

            while (true)
            {
                byte[] header = new byte[4];

                int readlen = this.m_File.Read(header, 0, header.Length);

                var bb = header.Except(this.m_Riff);
                var cc = header.Except(this.m_List);
                if (cc.Count() == 0 || bb.Count() == 0)
                {
                    CQRiffList riff = new CQRiffList();
                    riff.Pos   = this.m_File.Position - 4;
                    riff.Tag   = Encoding.UTF8.GetString(header);
                    readlen    = this.m_File.Read(header, 0, header.Length);
                    riff.Size  = BitConverter.ToInt32(header, 0);
                    readlen    = this.m_File.Read(header, 0, header.Length);
                    riff.Name  = Encoding.UTF8.GetString(header);
                    riff.Datas = new ObservableCollection <CQRiffList>();
                    if (riff.Tag == "RIFF")
                    {
                        riffs_tree.Add(riff);

                        //this.Riffs.Add(riff);
                    }
                    else
                    {
                        riffs.Last().Datas.Add(riff);
                    }
                    riffs.Add(riff);
                }
                else
                {
                    CQRiffList riff = new CQRiffList();
                    riff.Pos  = this.m_File.Position - 4;
                    riff.Tag  = Encoding.UTF8.GetString(header);
                    readlen   = this.m_File.Read(header, 0, header.Length);
                    riff.Size = BitConverter.ToInt32(header, 0);

                    int ss = riff.Size % 2;

                    long pos = this.m_File.Position + riff.Size + ss;
                    if (riffs.Count > 0)
                    {
                        riffs.Last().Datas.Add(riff);
                    }

                    if (riff.Size < 0)
                    {
                        break;
                    }
                    else if (riffs.Count > 0)
                    {
                        while (riffs.Count > 0)
                        {
                            if (pos >= riffs.Last().Pos + 8 + riffs.Last().Size)
                            {
                                if (riffs.Count > 0)
                                {
                                    riffs.Remove(riffs.Last());
                                }
                            }
                            else
                            {
                                break;
                            }
                        }
                    }
                    this.m_File.Position = pos;
                }
                if ((this.m_File.Length - this.m_File.Position) <= 4)
                {
                    break;
                }
            }
            return(true);
        }