public override int Write(System.IO.BinaryWriter bw) { long p = bw.BaseStream.Position; int len = 0; bw.Write(RiffParser.ToFourCC("LIST")); bw.Write(0); bw.Write(RiffParser.ToFourCC(name)); if (this.subList.Count > 0) { foreach (RIFFBase rb in this.subList) { len += rb.Write(bw); } } else { //bw.Write(content); len = content.Length; } long sp = bw.BaseStream.Position; bw.BaseStream.Position -= len + 8; bw.Write(len + 4); bw.BaseStream.Position = sp; if ((len & 1) != 0) { bw.Write(false); } return((int)(bw.BaseStream.Position - p)); }
public override int Write(BinaryWriter bw) { long sp = bw.BaseStream.Position; int[] blockSizes = new int[0]; byte[] data = RiffConn.WriteRiff(subList, ref blockSizes, true); FileStream fs = File.Open("C:\\data1", FileMode.OpenOrCreate | FileMode.Truncate); fs.Write(data, 0, data.Length); fs.Close(); byte[] zdata = ZLibNet.ZLibCompressor.Compress(data); byte[] blocks = new byte[blockSizes.Length * 4]; MemoryStream ms = new MemoryStream(blocks); BinaryWriter b2 = new BinaryWriter(ms); for (int i = 0, j = 0; i < blocks.Length; i += 4, j++) { b2.Write(blockSizes[j]); } fs = File.Open("C:\\blocks1", FileMode.OpenOrCreate | FileMode.Truncate); fs.Write(blocks, 0, blocks.Length); fs.Close(); b2.Close(); ms.Close(); byte[] zblk = ZLibNet.ZLibCompressor.Compress(blocks); byte[] wt; ms = new MemoryStream(); ms.SetLength(99999999); BinaryWriter bww = new BinaryWriter(ms); bww.Write(RiffParser.ToFourCC("cmpr")); bww.Write(zdata.Length + 8); bww.Write(data.Length); bww.Write(zblk.Length + 8); bww.Write(blocks.Length); bww.Write(Encoding.UTF8.GetBytes("CPng\x01\x00\x04\x00")); bww.Write(zdata); bww.Write(Encoding.UTF8.GetBytes("CPng\x01\x00\x04\x00")); bww.Write(zblk); int p = (int)ms.Position; wt = new byte[p]; Array.Copy(ms.GetBuffer(), wt, p); bww.Close(); ms.Close(); bw.Write(RiffParser.ToFourCC("LIST")); bw.Write(wt.Length); bw.Write(wt, 0, p); int len = (int)(bw.BaseStream.Position - sp); if ((len & 1) != 0) { bw.Write(false); } return(len); }
public override int Write(System.IO.BinaryWriter bw) { if (this.content != null) { return(base.Write(bw)); } long p = bw.BaseStream.Position; bw.Write(RiffParser.ToFourCC(name)); bw.Write(2); bw.Write((short)(m_version * 100)); return((int)(bw.BaseStream.Position - p)); }
public void Write(String cdrPath) { if (m_cdrFile == null) { return; } FileStream fs = File.Open(cdrPath, FileMode.OpenOrCreate); BinaryWriter bw = new BinaryWriter(fs); bw.Write(RiffParser.ToFourCC("RIFF")); bw.Write(0); bw.Write(RiffParser.ToFourCC(m_cdrFile.verType)); foreach (RIFFBase rl in m_cdrFile.list) { rl.Write(bw); } int pos = (int)fs.Position; bw.Seek(4, SeekOrigin.Begin); bw.Write(pos - 8); bw.Close(); fs.Close(); }
public static byte[] WriteRiff(List <RIFFBase> list, ref int[] blockSizes, bool outBlockSize = false) { byte[] tmp = new byte[0xffffff]; List <int> bs = null; if (outBlockSize) { bs = new List <int>(blockSizes); } MemoryStream ms = new MemoryStream(); BinaryWriter bw = new BinaryWriter(ms); foreach (RIFFBase rl in list) { switch (rl.Type) { case RiffType.Chunk: bw.Write(RiffParser.ToFourCC(rl.name)); byte[] content = ((RiffChunk)rl).GetContent(); if (bs != null) { bs.Add(content.Length); bw.Write(bs.Count - 1); } else { bw.Write(content.Length); } bw.Write(content); if ((content.Length & 1) != 0) { bw.Write(false); } break; case RiffType.LIST: bw.Write(RiffParser.ToFourCC("LIST")); int bsIndex = -1; if (bw != null) { bsIndex = bs.Count; bs.Add(0); } bw.Write(0); bw.Write(RiffParser.ToFourCC(rl.name)); long op = bw.BaseStream.Position; blockSizes = bs.ToArray(); if (((RiffList)rl).subList.Count > 0) { byte[] t1 = WriteRiff(((RiffList)rl).subList, ref blockSizes, outBlockSize); bs = new List <int>(blockSizes); bw.Write(t1); } else { bw.Write(rl.content); } long sp = bw.BaseStream.Position; int len = (int)(sp - op); bw.BaseStream.Position -= len + 8; if (bs == null) { bw.Write(len); } else { bs.Insert(bsIndex, len + 4); bs.RemoveAt(bsIndex + 1); bw.Write(bsIndex); } bw.BaseStream.Position = sp; break; } } int p = (int)ms.Position; byte[] o = new byte[p]; Array.Copy(ms.GetBuffer(), o, p); bw.Close(); ms.Close(); blockSizes = bs.ToArray(); return(o); }