public static Replay Parse(string filePath) { var parsedReplay = new Replay(); using (var fs = new FileStream(filePath, FileMode.Open)) using (var br = new BinaryReader(fs)) { parsedReplay.ReplayVersion = br.ReadString(); parsedReplay.MapMd5 = br.ReadString(); br.ReadString(); parsedReplay.PlayerName = br.ReadString(); br.ReadString(); br.ReadInt64(); parsedReplay.Mode = (GameMode)br.ReadInt32(); if (parsedReplay.ReplayVersion == "0.0.1" || parsedReplay.ReplayVersion == "None") { parsedReplay.Mods = (Mods)br.ReadInt32(); } else { parsedReplay.Mods = (Mods)br.ReadInt64(); } br.ReadBytes(40); if (parsedReplay.ReplayVersion != "None") { var replayVersion = new Version(parsedReplay.ReplayVersion); if (replayVersion >= new Version("0.0.1")) { parsedReplay.RandomizeModifierSeed = br.ReadInt32(); } } parsedReplay.Frames = new List <ReplayFrame>(); var frames = new List <string>(); frames = Encoding.ASCII.GetString(LZMAHelper.Decompress(br.BaseStream).ToArray()).Split(',').ToList(); foreach (var frame in frames) { try { var frameSplit = frame.Split('|'); parsedReplay.Frames.Add(new ReplayFrame(int.Parse(frameSplit[0]), (ReplayKeyPressState)Enum.Parse(typeof(ReplayKeyPressState), frameSplit[1]))); } catch { continue; } } } return(parsedReplay); }
public static void ReadByte(string scode, com_pixelEdit edit) { try { var src = edit.edit; var p = edit.palette; string strbase64 = System.Uri.UnescapeDataString(scode); byte[] bb = System.Convert.FromBase64String(strbase64); var s = LZMAHelper.DeCompress(new System.IO.MemoryStream(bb), (uint)bb.Length); bb = new byte[s.Length]; s.Read(bb, 0, bb.Length); int seek = 0; int width = bb[seek]; seek++; if (width == 0) { width = 256; } int height = bb[seek]; seek++; if (height == 0) { height = 256; } Debug.Log("w=" + width + ",h=" + height); edit.Resize(width, height); Color32[] pp = src.GetPixels32(0); for (int y = 0; y < height; y++) { for (int x = 0; x < width; x++) { byte ind = bb[seek]; seek++; pp[y * width + x].a = ind; } } src.SetPixels32(pp, 0); src.Apply(); Color32[] ppp = p.GetPixels32(0); int c = bb[seek]; seek++; for (int i = 0; i < c; i++) { byte inde = bb[seek]; seek++; byte r = bb[seek]; seek++; byte g = bb[seek]; seek++; byte b = bb[seek]; seek++; ppp[inde].r = r; ppp[inde].g = g; ppp[inde].b = b; } p.SetPixels32(ppp); p.Apply(); } catch { } }
public override void Load() { base.Load(); string path = m_Path; m_NeedUnpack = ConstantData.enableUnpack && path.Contains(ConstantData.assetBundleAbsolutePath); if (m_Async) { if (m_NeedUnpack) { m_StageCount = 2; byte[] bytes = FileHelper.ReadByteFromFile(path); m_DecompressRequest = LZMACompressRequest.CreateDecompress(bytes); } else { m_abRequest = AssetBundle.LoadFromFileAsync(path); } } else { AssetBundle ab = null; try { if (m_NeedUnpack) { byte[] bytes = FileHelper.ReadByteFromFile(path); byte[] result = new byte[1]; int size = LZMAHelper.Uncompress(bytes, ref result); if (size == 0) { UnityEngine.Debug.Log("Uncompress Failed"); } else { ab = AssetBundle.LoadFromMemory(result); } } else { ab = AssetBundle.LoadFromFile(path); } } catch (System.Exception e) { UnityEngine.Debug.Log(e.Message); } finally { OnLoaded(ab); } } }
void TestDeCompress() { try { LZMAHelper.DeCompress(ApplicationdataPath + "/Package_unitypackage.7z", ApplicationdataPath + "/Package_decompress.upk", m_CodeProgress); } catch (Exception ex) { Debug.Log(ex); } }
/// <summary> /// 压缩 /// </summary> public void Compress() { this.slider.value = 0; new Thread(() => { LZMAHelper.Compress(path + "/PackFolder/xml.upk", path + "/PackFolder/xml.zupk", cp, (str) => { print(str); }); }).Start(); //this.StartCoroutine(WaitCompress()); }
/// <summary> /// 解压 /// </summary> public void Decompress() { this.progress = 0; new Thread(() => { LZMAHelper.DeCompress(path + "/Enemy/Enemy.zupk", path + "/Enemy/EnemyDe.upk", cp, (str) => { print(str); Release(); //释放完成之后就将isReleaseOver设置为true; isReleaseOver = true; }); }).Start(); //this.StartCoroutine(this.WaitDecompress()); }
void ExtractUPK(UpdateVersion zipInfo) { try { string localPak = ResMng.GetUpdateTmpPath() + "/" + Guid.NewGuid().ToString() + ".pak"; if (File.Exists(localPak)) { File.Delete(localPak); } LZMAHelper.DeCompressFile(zipInfo.File.strLocalPath, localPak); UPKExtra.ExtraUPK(localPak, ResMng.GetResPath()); AppInfo.SetAppVersion(zipInfo.VersionMax); UpdateHelper.CleanVersion(); GameStart(); } catch (Exception exp) { Log.WriteError(exp.Message + "|" + exp.StackTrace); } }
private static unsafe string LZMATest() { //var opts = new LZMAOptionLZMA(9); Console.WriteLine("opt-size {0}", sizeof(LZMAOptionLZMA)); Console.WriteLine("stream-size {0}", sizeof(LZMAStreamNative)); Console.WriteLine("filter-size {0}", sizeof(LZMAFilter)); var z = new LZMAStream(new FileStream("test.xz", FileMode.Create), CompressionMode.Compress, 3) { CloseUnderlyingStream = true }; var b = Encoding.ASCII.GetBytes("Just some test string to compress with lzma"); z.Write(b, 0, b.Length); z.Close(); Console.WriteLine("{0} bytes read, {1} bytes written", z.TotalBytesIn, z.TotalBytesOut); var t = new LZMAStream(new FileStream("test.xz", FileMode.Open), CompressionMode.Decompress) { CloseUnderlyingStream = true }; t.Read(b, 0, b.Length); var s = Encoding.ASCII.GetString(b); Console.WriteLine("{0} bytes read, {1} bytes written", t.TotalBytesIn, t.TotalBytesOut); Console.ReadLine(); var bc = new byte[1000]; int ip; int op; var compRet = LZMAHelper.CompressBuffer(b, bc, out op, 9); Console.WriteLine("{0} bytes read, {1} bytes written, {2}", b.Length, op, compRet); op = 0; var decRet = LZMAHelper.DecompressBuffer(bc, out ip, b, out op); Console.WriteLine("{0} bytes read, {1} bytes written, {2}", ip, op, decRet); File.Delete("test.xz"); return(s); }
/// <summary> /// Parses .osr file. /// </summary> /// <param name="stream">Stream containing replay data.</param> /// <returns>A usable <see cref="Replay"/>.</returns> public static Replay Decode(Stream stream) { Replay replay = new Replay(); using (var r = new SerializationReader(stream)) { replay.Ruleset = (Ruleset)r.ReadByte(); replay.OsuVersion = r.ReadInt32(); replay.BeatmapMD5Hash = r.ReadString(); replay.PlayerName = r.ReadString(); replay.ReplayMD5Hash = r.ReadString(); replay.Count300 = r.ReadUInt16(); replay.Count100 = r.ReadUInt16(); replay.Count50 = r.ReadUInt16(); replay.CountGeki = r.ReadUInt16(); replay.CountKatu = r.ReadUInt16(); replay.CountMiss = r.ReadUInt16(); replay.ReplayScore = r.ReadInt32(); replay.Combo = r.ReadUInt16(); replay.PerfectCombo = r.ReadBoolean(); replay.Mods = (Mods)r.ReadInt32(); string lifeData = r.ReadString(); if (!string.IsNullOrEmpty(lifeData)) { foreach (string lifeBlock in lifeData.Split(',')) { string[] split = lifeBlock.Split('|'); if (split.Length < 2) { continue; } replay.LifeFrames.Add(new LifeFrame() { Time = Convert.ToInt32(split[0]), Percentage = ParseHelper.ToFloat(split[1]) }); } } replay.ReplayTimestamp = r.ReadDateTime(); replay.ReplayLength = r.ReadInt32(); if (replay.ReplayLength > 0) { byte[] replayDataBytes = r.ReadBytes(replay.ReplayLength); byte[] decompressedBytes = LZMAHelper.Decompress(replayDataBytes); string decompressedString = Encoding.ASCII.GetString(decompressedBytes); int lastTime = 0; foreach (string frame in decompressedString.Split(',')) { if (string.IsNullOrEmpty(frame)) { continue; } string[] split = frame.Split('|'); if (split.Length < 4) { continue; } if (split[0] == "-12345") { replay.Seed = Convert.ToInt32(split[3]); continue; } ReplayFrame replayFrame = new ReplayFrame(); replayFrame.TimeDiff = Convert.ToInt32(split[0]); replayFrame.Time = Convert.ToInt32(split[0]) + lastTime; replayFrame.X = ParseHelper.ToFloat(split[1]); replayFrame.Y = ParseHelper.ToFloat(split[2]); switch (replay.Ruleset) { case Ruleset.Standard: replayFrame.StandardKeys = (StandardKeys)Convert.ToInt32(split[3]); break; case Ruleset.Taiko: replayFrame.TaikoKeys = (TaikoKeys)Convert.ToInt32(split[3]); break; case Ruleset.Fruits: replayFrame.CatchKeys = (CatchKeys)Convert.ToInt32(split[3]); break; case Ruleset.Mania: replayFrame.ManiaKeys = (ManiaKeys)replayFrame.X; break; } replay.ReplayFrames.Add(replayFrame); lastTime = replay.ReplayFrames.Last().Time; } } if (r.BaseStream.Length - r.BaseStream.Position > 0) { if (r.BaseStream.Length - r.BaseStream.Position == 4) { replay.OnlineId = r.ReadInt32(); } else { replay.OnlineId = r.ReadInt64(); } } } return(replay); }
public static void Write(Replay replay, string path) { using (SerializationWriter writer = new SerializationWriter(new FileStream(path, FileMode.Create, FileAccess.Write, FileShare.Read))) { writer.Write((byte)replay.Ruleset); writer.Write(replay.OsuVersion); writer.Write(replay.BeatmapMD5Hash); writer.Write(replay.PlayerName); writer.Write(replay.ReplayMD5Hash); writer.Write(replay.Count300); writer.Write(replay.Count100); writer.Write(replay.Count50); writer.Write(replay.CountGeki); writer.Write(replay.CountKatu); writer.Write(replay.CountMiss); writer.Write(replay.ReplayScore); writer.Write(replay.Combo); writer.Write(replay.PerfectCombo); writer.Write((int)replay.Mods); string lifeFrames = null; foreach (LifeFrame frame in replay.LifeFrames) { lifeFrames += $"{frame.Time.Format()}|{frame.Percentage.Format()},"; } writer.Write(lifeFrames); writer.Write(replay.ReplayTimestamp.ToUniversalTime().Ticks); if (replay.ReplayFrames.Count == 0) { writer.Write(0); } else { string replayFrames = string.Empty; foreach (ReplayFrame frame in replay.ReplayFrames) { int keys = 0; switch (replay.Ruleset) { case Ruleset.Standard: keys = (int)frame.StandardKeys; break; case Ruleset.Taiko: keys = (int)frame.TaikoKeys; break; case Ruleset.Fruits: keys = (int)frame.CatchKeys; break; case Ruleset.Mania: keys = (int)frame.ManiaKeys; break; } replayFrames += $"{frame.TimeDiff}|{frame.X.Format()}|{frame.Y.Format()}|{keys},"; } byte[] rawBytes = Encoding.ASCII.GetBytes(replayFrames); using (MemoryStream ms = new MemoryStream()) { ms.Write(rawBytes, 0, rawBytes.Length); MemoryStream codedStream = LZMAHelper.Compress(ms); byte[] rawBytesCompressed = new byte[codedStream.Length]; codedStream.Read(rawBytesCompressed, 0, rawBytesCompressed.Length); writer.Write(rawBytesCompressed.Length); writer.Write(rawBytesCompressed); } } writer.Write(replay.OnlineId); } }
IEnumerator WaitDecompress() { yield return(new WaitForSeconds(1)); LZMAHelper.DeCompress(Application.dataPath + "/PackFolder/xml.zupk", Application.dataPath + "/PackFolder/xmlDe.upk", cp); }