public void TestInvalidChecksum()
        {
            byte[] testData = Encoding.ASCII.GetBytes("This is a test string");

            MemoryStream compressedStream = new MemoryStream();

            using (ZlibStream zs = new ZlibStream(compressedStream, CompressionMode.Compress, true))
            {
                zs.Write(testData, 0, testData.Length);
            }

            compressedStream.Seek(-2, SeekOrigin.End);
            compressedStream.Write(new byte[] { 0, 0 }, 0, 2);

            compressedStream.Position = 0;
            Assert.Throws <InvalidDataException>(() =>
            {
                using (ZlibStream uzs = new ZlibStream(compressedStream, CompressionMode.Decompress, true))
                {
                    byte[] outData = new byte[testData.Length];
                    uzs.Read(outData, 0, outData.Length);
                    Assert.Equal(testData, outData);

                    // Should be end of stream
                    Assert.Equal(-1, uzs.ReadByte());
                }
            });
        }
Beispiel #2
0
 /// <summary>
 /// Decompresses the specified data.
 /// </summary>
 /// <param name="data">The compressed byte array.</param>
 /// <param name="pos">The starting position into the byte array.</param>
 /// <param name="Length">The number of compressed bytes to decompress.</param>
 /// <returns>An uncompressed byte array</returns>
 public static byte[] Decompress(byte[] data, int pos, int Length)
 {
     byte[] compressedData = new byte[Length];
     Array.Copy(data, pos + 50, compressedData, 0, Length);
     using (MemoryStream ms = new MemoryStream(compressedData))
     {
         using (ZlibStream inflaterInputStream = new ZlibStream(ms, CompressionMode.Decompress))
         {
             using (MemoryStream out1 = new MemoryStream())
             {
                 int c;
                 try
                 {
                     while ((c = inflaterInputStream.ReadByte()) != -1)
                     {
                         out1.WriteByte((byte)c);
                     }
                     return(out1.ToArray());
                 }
                 catch (IOException e)
                 {
                     throw new RecordFormatException(e.ToString());
                 }
             }
         }
     }
 }
Beispiel #3
0
 public static byte ReadCompressedID(byte[] compressed)
 {
     using (MemoryStream input = new MemoryStream(compressed))
         using (ZlibStream zin = new ZlibStream(input, CompressionMode.Decompress))
         {
             int val = zin.ReadByte();
             if (val < 0)
             {
                 throw new InvalidDataException();
             }
             return((byte)val);
         }
 }
Beispiel #4
0
        byte[] DecompressZlib(byte[] data, int rawSize)
        {
            using MemoryStream memoryStream = new MemoryStream(data);

            using ZlibStream stream = new ZlibStream(memoryStream, CompressionMode.Decompress, CompressionLevel.Default);

            byte[] result = new byte[rawSize];

            int offset = 0;
            int b;

            while ((b = stream.ReadByte()) != -1)
            {
                result[offset++] = (byte)b;
            }

            return(result);
        }
        public void TestRoundtrip()
        {
            byte[] testData = Encoding.ASCII.GetBytes("This is a test string");

            MemoryStream compressedStream = new MemoryStream();

            using (ZlibStream zs = new ZlibStream(compressedStream, CompressionMode.Compress, true))
            {
                zs.Write(testData, 0, testData.Length);
            }

            compressedStream.Position = 0;
            using (ZlibStream uzs = new ZlibStream(compressedStream, CompressionMode.Decompress, true))
            {
                byte[] outData = new byte[testData.Length];
                uzs.Read(outData, 0, outData.Length);
                Assert.Equal(testData, outData);

                // Should be end of stream
                Assert.Equal(-1, uzs.ReadByte());
            }
        }
Beispiel #6
0
        public static void LoadCompound(BinaryReader stream, GameObject root, float voxelSize, bool first, Color32[] palette)
        {
            var nameLength = stream.ReadInt32();
            var name       = new string(stream.ReadChars(nameLength));

            var px = stream.ReadInt32();
            var py = stream.ReadInt32();
            var pz = stream.ReadInt32();

            px = -px;

            // PicaVoxel doesn't support scaling of volumes, sorry!
            stream.ReadInt32();
            stream.ReadInt32();
            stream.ReadInt32();

            var pivx = stream.ReadSingle();
            var pivy = stream.ReadSingle();
            var pivz = stream.ReadSingle();

            var sizeX = (int)stream.ReadUInt32();
            var sizeY = (int)stream.ReadUInt32();
            var sizeZ = (int)stream.ReadUInt32();

            pivx = sizeX - pivx;

            var child = Editor.Instantiate(EditorUtility.VoxelVolumePrefab, Vector3.zero, Quaternion.identity) as GameObject;

            child.transform.SetParent(root.transform);
            child.name = name;
            child.GetComponent <Volume>().Material = EditorUtility.PicaVoxelDiffuseMaterial;
            child.GetComponent <Volume>().GenerateBasic(FillMode.None);
            Volume voxelVolume = child.GetComponent <Volume>();

            voxelVolume.XSize            = Convert.ToInt32(sizeX);
            voxelVolume.YSize            = Convert.ToInt32(sizeY);
            voxelVolume.ZSize            = Convert.ToInt32(sizeZ);
            voxelVolume.Frames[0].XSize  = Convert.ToInt32(sizeX);
            voxelVolume.Frames[0].YSize  = Convert.ToInt32(sizeY);
            voxelVolume.Frames[0].ZSize  = Convert.ToInt32(sizeZ);
            voxelVolume.Frames[0].Voxels = new Voxel[sizeX * sizeY * sizeZ];
            voxelVolume.VoxelSize        = voxelSize;

            var dataSize       = (int)stream.ReadUInt32();
            var compressedData = stream.ReadBytes(dataSize);

            using (var ms = new MemoryStream(compressedData))
            {
                using (var gzs = new ZlibStream(ms, CompressionMode.Decompress, true))
                {
                    for (var x = 0; x < sizeX; x++)
                    {
                        for (var z = 0; z < sizeZ; z++)
                        {
                            for (var y = 0; y < sizeY; y++)
                            {
                                var r = (byte)gzs.ReadByte();
                                var g = (byte)gzs.ReadByte();
                                var b = (byte)gzs.ReadByte();
                                var m = (byte)gzs.ReadByte();
                                if (m > 0)
                                {
                                    voxelVolume.Frames[0].Voxels[(sizeX - 1 - x) + sizeX * (y + sizeY * z)] = new Voxel()
                                    {
                                        Color = palette == null ? new Color32(r, g, b, 255) : palette[r], Value = 128, State = VoxelState.Active
                                    }
                                }
                                ;
                            }
                        }
                    }
                }
            }

            voxelVolume.CreateChunks();
            voxelVolume.SaveForSerialize();

            var pivot = new Vector3(pivx, pivy, pivz) * voxelSize;

            voxelVolume.Pivot = pivot;
            voxelVolume.UpdatePivot();

            voxelVolume.transform.localPosition = (new Vector3(-sizeX + px, py, pz) * voxelSize) + pivot;

            var childCount = stream.ReadUInt32();

            for (var i = 0; i < childCount; i++)
            {
                LoadNode(stream, child, voxelSize, first, palette);
            }
        }
Beispiel #7
0
        public override object ReadJson(JsonReader reader, Type objectType, object existingValue,
                                        JsonSerializer serializer)
        {
            if (serializer == null)
            {
                throw new ArgumentNullException(nameof(serializer));
            }

            var jo = JObject.Load(reader);

            byte[]    buffer = null;
            BaseLayer result;

            switch (jo["type"].Value <string>())
            {
            case "tilelayer":
                result = new TileLayer();
                if (jo["encoding"]?.Value <string>() == "base64")
                {
                    buffer = Convert.FromBase64String(jo["data"].Value <string>());
                    jo["data"].Replace(JToken.FromObject(Array.Empty <int>()));
                }

                break;

            case "objectgroup":
                result = new ObjectLayer();
                break;

            case "imagelayer":
                result = new ImageLayer();
                break;

            default:
                return(null);
            }

            serializer.Populate(jo.CreateReader(), result);

            if (result is TileLayer tl && buffer != null)
            {
                switch (tl.Compression)
                {
                case null:
                    tl.Data = new int[buffer.Length / sizeof(int)];
                    Buffer.BlockCopy(buffer, 0, tl.Data, 0, buffer.Length);
                    break;

                case "zlib":
                    using (var mStream = new MemoryStream(buffer))
                    {
                        using var stream = new ZlibStream(mStream, CompressionMode.Decompress);
                        var bufferSize = result.Width * result.Height * sizeof(int);
                        Array.Resize(ref buffer, bufferSize);
                        stream.Read(buffer, 0, bufferSize);

                        if (stream.ReadByte() != -1)
                        {
                            throw new JsonException();
                        }

                        tl.Data = new int[result.Width * result.Height];
                        Buffer.BlockCopy(buffer, 0, tl.Data, 0, buffer.Length);
                    }

                    break;

                case "gzip":
                    using (var mStream = new MemoryStream(buffer))
                    {
                        using var stream = new GZipStream(mStream, CompressionMode.Decompress);
                        var bufferSize = result.Width * result.Height * sizeof(int);
                        Array.Resize(ref buffer, bufferSize);
                        stream.Read(buffer, 0, bufferSize);

                        if (stream.ReadByte() != -1)
                        {
                            throw new JsonException();
                        }

                        tl.Data = new int[result.Width * result.Height];
                        Buffer.BlockCopy(buffer, 0, tl.Data, 0, buffer.Length);
                    }

                    break;

                default:
                    throw new NotImplementedException($"Compression: {tl.Compression}");
                }
            }


            return(result);
        }
Beispiel #8
0
        // args[0] - ключ для паковки / распаковки
        //              e - распаковать / extract
        //              c - запаковать / compress
        // args[1] - путь до файла, который будем паковать или распаковывать / path to file

        static void Main(string[] args)
        {
            //' на основе вот этого топака : http://www.theswamp.org/index.php?topic=41529.0
            if (args.Length == 2)
            {
                if (File.Exists(args[1]))
                {
                    // тут распаковываем архивчик, Extract
                    if ((args[0] == "e") || (args[0] == "-e"))
                    {
                        string fileName = args[1];
                        string ext      = Path.GetExtension(fileName).ToUpper();
                        if ((0 == String.Compare(ext, ".PC3")) || (0 == String.Compare(ext, ".PMP")) || (0 == String.Compare(ext, ".CTB")))
                        {
                            using (FileStream fs = File.Open(fileName, FileMode.Open, FileAccess.Read))
                            {
                                fs.Seek(60L, SeekOrigin.Begin);
                                using (ZlibStream zs = new ZlibStream(fs, CompressionMode.Decompress))
                                {
                                    // Console.WriteLine("\nStart:");
                                    int chr;
                                    chr = 0;
                                    string str = "";

                                    while (chr > -1)
                                    {
                                        chr = zs.ReadByte();
                                        if (chr > -1)
                                        {
                                            str = str + Convert.ToChar(chr);
                                        }
                                    }
                                    //Console.Write(str);
                                    //Console.WriteLine("\nend:");

                                    /* using (StreamReader sr = new StreamReader(zs))
                                     * {
                                     *   //тут текстово содержание файла
                                     *   string s = sr.ReadToEnd();
                                     *   //Console.WriteLine(s);
                                     */
                                    using (FileStream fs_out = File.Open(fileName + ".txt", FileMode.Create, FileAccess.ReadWrite))
                                    {
                                        fs_out.Write(Encoding.Default.GetBytes(str), 0, Encoding.Default.GetBytes(str).Length);
                                    }
                                    //}
                                    Console.WriteLine("\n File saved to {0}.txt ", fileName);
                                }
                            }
                        }
                        else
                        {
                            Console.Write("File {0} is not a .pc3 file", args[1]);
                        }
                    }
                    else if ((args[0] == "c") || (args[0] == "-c"))// Тут запаковываем все обратно, COMPRESS
                    {
                        string fileName = args[1];
                        string ext      = Path.GetExtension(fileName);
                        if (0 == String.Compare(ext.ToUpper(), ".TXT"))
                        {
                            using (FileStream fs = File.Open(fileName, FileMode.Open, FileAccess.Read))
                            {
                                using (StreamReader sr = new StreamReader(fs, Encoding.Default)) /*Mod by Arie add encoding*/
                                {
                                    // заголовок файла, без него автокад не работает
                                    String pref_s = "PIAFILEVERSION_2.0,PC3VER1,compress\r\npmzlibcodec";

                                    /*
                                     * is a good starting point, but contains several errors/lack of information
                                     * The header size is 60 No 59
                                     * bytes 49->52 = ZlibCodec.Adler32
                                     * bytes 53->56 = decompresse stream size
                                     * bytes 57->60 = compressed stream size
                                     * Эти данные(байты) должны вычеслятся
                                     */
                                    String s = sr.ReadToEnd();
                                    //Console.Write(s);
                                    //Byte[] ZlibCodec_Adler32 = { 157, 94, 173, 006 };
                                    long decompresse_stream_size = fs.Length;
                                    //тут считаем размер запакованных данных
                                    byte[] compressed_stream_size;
                                    using (var ms = new MemoryStream())
                                    {
                                        using (ZlibStream deflateStream = new ZlibStream(ms, CompressionMode.Compress, CompressionLevel.BestCompression, false))
                                        {
                                            deflateStream.Write(Encoding.Default.GetBytes(s), 0, Encoding.Default.GetBytes(s).Length);
                                        }
                                        compressed_stream_size = ms.ToArray();
                                    }

                                    // Тут все пишем в файл
                                    using (FileStream fs_out = File.Open(fileName + ".pc3", FileMode.Create, FileAccess.ReadWrite))
                                    {
                                        using (ZlibStream zs = new ZlibStream(fs_out, CompressionMode.Compress,
                                                                              CompressionLevel.BestCompression, false))
                                        {
                                            fs_out.Write(Encoding.Default.GetBytes(pref_s), 0, Encoding.Default.GetBytes(pref_s).Length);
                                            //fs_out.Write(ZlibCodec_Adler32, 0, 4);
                                            fs_out.Write(BitConverter.GetBytes(new ZlibCodec(CompressionMode.Compress).Adler32), 0, 4);
                                            fs_out.Write(BitConverter.GetBytes(decompresse_stream_size), 0, 4);
                                            fs_out.Write(BitConverter.GetBytes(compressed_stream_size.Length), 0, 4);
                                            zs.Write(Encoding.Default.GetBytes(s), 0, Encoding.Default.GetBytes(s).Length);
                                        }
                                    }
                                    Console.WriteLine("\n File saved to {0}.pc3 ", fileName);
                                }
                            }
                        }
                        else
                        {
                            Console.Write("File {0} is not a .txt file", args[1]);
                        }
                    }
                    else
                    {
                        Console.Write("incorrect input\nFormat unzip_pc3 (AutoCAD zip/unzip .pc3 files) \n to extract: unzip_pc3 e xxx.pc3\n to Compress: unzip_pc3 c xxx.txt");
                    }
                }
                else
                {
                    Console.Write("File {0} does not exist", args[1]);
                }
            }
            else
            {
                Console.Write("incorrect input\nFormat unzip_pc3 (AutoCAD zip/unzip .pc3 files) \n to extract: unzip_pc3 e xxx.pc3\n to Compress: unzip_pc3 c xxx.txt");
            }
        }
    void LoadCompound(BinaryReader stream)
    {
        if (showLogs)
        {
            Debug.Log("[QBT] LoadCompound");
        }

        int    nameLength = stream.ReadInt32();
        string name       = new string(stream.ReadChars(nameLength));

        if (showLogs)
        {
            Debug.Log("[QBT] name: " + name);
        }

        Vector3 position = new Vector3();

        position.x = stream.ReadInt32();
        position.y = stream.ReadInt32();
        position.z = stream.ReadInt32();

        Vector3 localScale = new Vector3();

        localScale.x = stream.ReadUInt32();
        localScale.y = stream.ReadUInt32();
        localScale.z = stream.ReadUInt32();

        Vector3 pivot = new Vector3();

        pivot.x = stream.ReadSingle();
        pivot.y = stream.ReadSingle();
        pivot.z = stream.ReadSingle();

        Vector3 size = new Vector3();

        size.x = stream.ReadUInt32();
        size.y = stream.ReadUInt32();
        size.z = stream.ReadUInt32();

        // Compressed voxel data size.
        stream.ReadUInt32();

        // TODO: voxelsData is overwrited
        voxelsData = new VoxelData[(int)size.x, (int)size.y, (int)size.z];

        var zlibStream = new ZlibStream(stream.BaseStream, Ionic.Zlib.CompressionMode.Decompress, true);

        for (uint x = 0; x < size.x; x++)
        {
            for (uint z = 0; z < size.z; z++)
            {
                for (uint y = 0; y < size.y; y++)
                {
                    VoxelData data = new VoxelData();

                    data.r = (byte)zlibStream.ReadByte();
                    data.g = (byte)zlibStream.ReadByte();
                    data.b = (byte)zlibStream.ReadByte();
                    data.m = (byte)zlibStream.ReadByte();

                    voxelsData[x, y, z] = data;
                }
            }
        }

        uint childCount = stream.ReadUInt32();

        if (mergeCompounds)           // if you don't need the datatree you can skip child nodes
        {
            for (uint i = 0; i < childCount; i++)
            {
                SkipNode(stream);
            }
        }
        else
        {
            for (uint i = 0; i < childCount; i++)
            {
                LoadNode(stream);
            }
        }
    }
    void LoadMatrix(BinaryReader stream)
    {
        if (showLogs)
        {
            Debug.Log("[QBT] LoadMatrix");
        }

        int    nameLength = stream.ReadInt32();
        string name       = new string(stream.ReadChars(nameLength));

        if (showLogs)
        {
            Debug.Log("[QBT] name: " + name);
        }

        Vector3 position = new Vector3();

        position.x = stream.ReadInt32();
        position.y = stream.ReadInt32();
        position.z = stream.ReadInt32();

        Vector3 localScale = new Vector3();

        localScale.x = stream.ReadUInt32();
        localScale.y = stream.ReadUInt32();
        localScale.z = stream.ReadUInt32();

        Vector3 pivot = new Vector3();

        pivot.x = stream.ReadSingle();
        pivot.y = stream.ReadSingle();
        pivot.z = stream.ReadSingle();

        Vector3 size = new Vector3();

        size.x = stream.ReadUInt32();
        size.y = stream.ReadUInt32();
        size.z = stream.ReadUInt32();

        // Compressed voxel data size.
        stream.ReadUInt32();

        voxelsData = new VoxelData[(int)size.x, (int)size.y, (int)size.z];

        var zlibStream = new ZlibStream(stream.BaseStream, Ionic.Zlib.CompressionMode.Decompress, true);

        for (uint x = 0; x < size.x; x++)
        {
            for (uint z = 0; z < size.z; z++)
            {
                for (uint y = 0; y < size.y; y++)
                {
                    VoxelData data = new VoxelData();

                    data.r = (byte)zlibStream.ReadByte();
                    data.g = (byte)zlibStream.ReadByte();
                    data.b = (byte)zlibStream.ReadByte();
                    data.m = (byte)zlibStream.ReadByte();

                    voxelsData[x, y, z] = data;
                    colors.Add(data.Color);
                }
            }
        }
    }