/// <summary> /// 解压并写入文件 /// </summary> /// <param name="copyWrite"></param> /// <param name="qqwry"></param> /// <param name="path"></param> private static void ExtractWriteDbFile(QQWryCopyWrite copyWrite, byte[] qqwry, string path) { //extract information from copywrite.rar if (qqwry.Length <= 24 || copyWrite.Sign != "CZIP") { throw new Exception("-2 sign error"); } if (qqwry.Length != copyWrite.Size) { throw new Exception("-4 size error"); } //decrypt var head = new byte[0x200]; var key = copyWrite.Key; for (var i = 0; i < 0x200; i++) { key = (key * 0x805 + 1) & 0xff; head[i] = (byte)(qqwry[i] ^ key); } Array.Copy(head, 0, qqwry, 0, head.Length); var dataBuffer = new byte[4096]; //decompress using (var inflaterInputStream = new InflaterInputStream(new MemoryStream(qqwry))) { //write file using (var fsOut = File.Create(path)) { //inflaterInputStream.CopyTo(fsOut); StreamUtils.Copy(inflaterInputStream, fsOut, dataBuffer); } } }
private static QQWryCopyWrite ReadFromStream(Stream copywriteStream) { var binaryReader = new BinaryReader(copywriteStream); var copyWrite = new QQWryCopyWrite() { Sign = Encoding.GetEncoding("gb2312").GetString(binaryReader.ReadBytesLE(4).Where(x => x != 0x00).ToArray()), Version = binaryReader.ReadUInt32LE(), Unknown1 = binaryReader.ReadUInt32LE(), Size = binaryReader.ReadUInt32LE(), Unknown2 = binaryReader.ReadUInt32LE(), Key = binaryReader.ReadUInt32LE(), Text = Encoding.GetEncoding("gb2312").GetString(binaryReader.ReadBytesLE(128).Where(x => x != 0x00).ToArray()), Link = Encoding.GetEncoding("gb2312").GetString(binaryReader.ReadBytesLE(128).Where(x => x != 0x00).ToArray()) }; return(copyWrite); }