示例#1
0
        /// <summary>把消息头写入到流中</summary>
        /// <param name="stream"></param>
        public void Write(Stream stream)
        {
            if (!UseHeader) return;

            var writer = new BinaryWriterX(stream);
            writer.Settings.EncodeInt = true;
            writer.Write((Byte)Flag);
            if (HasFlag(Flags.Channel)) writer.Write(Channel);
            if (HasFlag(Flags.SessionID)) writer.Write(SessionID);
            if (HasFlag(Flags.Length)) writer.Write(Length);
        }
示例#2
0
        public void SwitchNibbleBitWriting()
        {
            var expect = new byte[] {
                0x04, 0x00, 0xF8, 0x48
            };
            var ms = new MemoryStream();

            using (var bw = new BinaryWriterX(ms, ByteOrder.LittleEndian, NibbleOrder.LowNibbleFirst, BitOrder.MostSignificantBitFirst, 2))
            {
                bw.WriteNibble(0x4);
                bw.WriteBits(0x1F, 5);
                bw.WriteNibble(0x08);
                bw.WriteNibble(0x04);

                Assert.IsTrue(ms.ToArray().SequenceEqual(expect));
            }
        }
示例#3
0
        public void RecordStreams(float deltaT)
        {
            foreach (RefID user_id in current_eye_tracking_users)
            {
                //Encode the streams
                BinaryWriterX writer = output_writers[user_id];

                //WRITE deltaT
                writer.Write(deltaT); //float

                EyeTrackingStreamManager eyeStreams = eye_streams[user_id];
                //WRITE left eye streams
                WriteStreams(eyeStreams.LeftEyeStreams, writer);
                //WRITE right eye streams
                WriteStreams(eyeStreams.RightEyeStreams, writer);
            }
        }
示例#4
0
文件: XI.cs 项目: benladen/Kuriimu
        public static void Save(string filename, Bitmap bitmap)
        {
            int width  = bitmap.Width;
            int height = bitmap.Height;

            while (width % 8 != 0)
            {
                width++;
            }
            while (height % 8 != 0)
            {
                height++;
            }

            byte[] pic = Common.Save(bitmap, new ImageSettings
            {
                Width         = width,
                Height        = height,
                Orientation   = Orientation.TransposeTile,
                Format        = ImageSettings.ConvertFormat(header.imageFormat),
                PadToPowerOf2 = false
            });

            using (BinaryWriterX bw = new BinaryWriterX(File.Create(filename)))
            {
                List <short> table;
                byte[]       importPic = Deflate(pic, out table, 32, width, height);

                header.width       = (short)bitmap.Width;
                header.height      = (short)bitmap.Height;
                header.tableSize1  = table.Count * 2 + 4;
                header.tableSize2  = (header.tableSize1 + 3) & ~3;
                header.imgDataSize = importPic.Length + 4;
                bw.WriteStruct(header);

                bw.Write(header.tableSize1 << 3);
                foreach (var tableEntry in table)
                {
                    bw.Write(tableEntry);
                }

                bw.BaseStream.Position = 0x48 + header.tableSize2;
                bw.Write(header.imgDataSize << 3);
                bw.Write(importPic);
            }
        }
示例#5
0
        /// <inheritdoc cref="Load"/>
        public byte[] Save(IEnumerable <Color> colors, EncodingSaveContext saveContext)
        {
            var ms = new MemoryStream();

            using var bw = new BinaryWriterX(ms, _byteOrder, _bitOrder, 1);

            var values = colors.AsParallel().AsOrdered()
                         .WithDegreeOfParallelism(saveContext.TaskCount)
                         .Select(_descriptor.GetValue);

            foreach (var value in values)
            {
                _writeValueDelegate(bw, value);
            }

            return(ms.ToArray());
        }
示例#6
0
        private Stream WriteArguments(IList <Argument> arguments)
        {
            var argumentStream = new MemoryStream();

            using var bw = new BinaryWriterX(argumentStream, true);
            foreach (var argument in arguments)
            {
                bw.WriteType(new XseqArgument
                {
                    type  = argument.Type,
                    value = (uint)argument.Value
                });
            }

            argumentStream.Position = 0;
            return(argumentStream);
        }
示例#7
0
        public void Save(Stream output, IList <ArchiveFileInfo> files)
        {
            var darcTreeBuilder = new U8TreeBuilder(Encoding.ASCII);

            darcTreeBuilder.Build(files.Select(x => ("/." + x.FilePath.FullName, x)).ToArray());

            var entries    = darcTreeBuilder.Entries;
            var nameStream = darcTreeBuilder.NameStream;

            var namePosition = _headerSize + entries.Count * _entrySize;
            var dataOffset   = (namePosition + (int)nameStream.Length + 0x1F) & ~0x1F;

            using var bw = new BinaryWriterX(output, ByteOrder.BigEndian);

            // Write names
            bw.BaseStream.Position = namePosition;
            nameStream.Position    = 0;
            nameStream.CopyTo(bw.BaseStream);
            bw.WriteAlignment(0x20);

            // Write files
            foreach (var(qpEntry, afi) in entries.Where(x => x.Item2 != null))
            {
                bw.WriteAlignment(0x20);
                var fileOffset = (int)bw.BaseStream.Position;

                var writtenSize = afi.SaveFileData(bw.BaseStream, null);

                qpEntry.offset = fileOffset;
                qpEntry.size   = (int)writtenSize;
            }

            // Write entries
            bw.BaseStream.Position = _headerSize;
            bw.WriteMultiple(entries.Select(x => x.Item1));

            // Write header
            bw.BaseStream.Position = 0;
            bw.WriteType(new U8Header
            {
                entryDataOffset = _headerSize,
                entryDataSize   = entries.Count * _entrySize + (int)nameStream.Length,
                dataOffset      = dataOffset
            });
            bw.WritePadding(0x10, 0xCC);
        }
示例#8
0
        public static void WriteFnt(BinaryWriterX bw, int fntOffset, IList <IArchiveFileInfo> files, int startFileId = 0)
        {
            var fileTree         = files.ToTree();
            var totalDirectories = CountTotalDirectories(fileTree);
            var contentOffset    = fntOffset + totalDirectories * Tools.MeasureType(typeof(MainFntEntry));

            var baseOffset = fntOffset;
            var fileId     = startFileId;
            var dirId      = 0;

            WriteFnt(bw, baseOffset, ref fntOffset, ref contentOffset, ref fileId, ref dirId, 0, fileTree);

            // Write total directories
            bw.BaseStream.Position = baseOffset + 6;
            bw.Write((short)totalDirectories);
            bw.BaseStream.Position = contentOffset;
        }
示例#9
0
 public void Write(Stream input)
 {
     using (var bw = new BinaryWriterX(input, true))
     {
         if (State == ArchiveFileState.Archived || Entry.uncompSize == 0)
         {
             base.FileData.CopyTo(bw.BaseStream);
         }
         else
         {
             var compData = new MemoryStream(LZ11.Compress(base.FileData));
             Entry.uncompSize = (uint)base.FileData.Length;
             Entry.compSize   = (uint)compData.Length;
             compData.CopyTo(bw.BaseStream);
         }
     }
 }
示例#10
0
        public void Save(string filename)
        {
            using (BinaryWriterX bw = new BinaryWriterX(File.Create(filename)))
            {
                //Update entries
                uint relOffset = 0;
                foreach (var label in Labels)
                {
                    foreach (var point in label.Points)
                    {
                        entries[point.Y].data[point.X].value = relOffset;
                    }

                    uint byteCount = (uint)GetEncodedText(label.Text.Replace("\n", "\\n").Replace("\xa", "\\n"), encoding).Length + 1;
                    relOffset += byteCount;
                }

                //Header
                header.stringSecSize = (int)(relOffset);
                bw.WriteStruct(header);

                //Entries
                foreach (var entry in entries)
                {
                    bw.Write(entry.entryTypeID);
                    bw.Write(entry.entryLength);
                    bw.Write(entry.typeMask);
                    foreach (var data in entry.data)
                    {
                        bw.Write(data.value);
                    }
                }
                bw.WriteAlignment(0x10, 0xff);

                //Text
                foreach (var label in Labels)
                {
                    bw.Write(GetEncodedText(label.Text.Replace("\n", "\\n").Replace("\xa", "\\n"), encoding));
                    bw.Write((byte)0);
                }
                bw.WriteAlignment(0x10, 0xff);

                //Signature
                bw.Write(sig);
            }
        }
示例#11
0
文件: Nxtch.cs 项目: obluda3/Kuriimu2
        public void Save(Stream output, ImageInfo imageInfo)
        {
            using var bw = new BinaryWriterX(output);

            var mipOffset  = HeaderSize;
            var dataOffset = 0x100;

            // Write image and mip data
            var mipOffsets = new List <int> {
                dataOffset
            };

            var dataPosition = dataOffset;

            output.Position = dataPosition;
            bw.Write(imageInfo.ImageData);
            dataPosition += imageInfo.ImageData.Length;

            if (imageInfo.MipMapCount > 0)
            {
                foreach (var mipData in imageInfo.MipMapData)
                {
                    mipOffsets.Add(dataPosition);
                    bw.Write(mipData);
                    dataPosition += mipData.Length;
                }
            }

            // Write mip offsets
            output.Position = mipOffset;
            bw.WriteMultiple(mipOffsets.Select(x => x - dataOffset));

            // Write unknown data
            bw.Write(_unkData);

            // Write header
            _header.mipMapCount      = imageInfo.MipMapCount;
            _header.format           = imageInfo.ImageFormat;
            _header.width            = imageInfo.ImageSize.Width;
            _header.height           = imageInfo.ImageSize.Height;
            _header.textureDataSize  = (int)(output.Length - dataOffset);
            _header.textureDataSize2 = (int)(output.Length - dataOffset);

            output.Position = 0;
            bw.WriteType(_header);
        }
示例#12
0
文件: NARC.cs 项目: wabberz/Kuriimu
        public void Save(Stream output)
        {
            using (var bw = new BinaryWriterX(output))
            {
                uint dataOffset = (uint)(0x10 + 0xc + Files.Count * 0x8 + 0x8 + nameP.Length + 0x8);

                //Files
                uint offset = 0;
                var  data   = new MemoryStream();
                foreach (var file in Files)
                {
                    file.FileData.CopyTo(data);
                    using (var dataB = new BinaryWriterX(data, true)) dataB.WriteAlignment(0x80, 0xff);

                    file.entry.startOffset = offset;
                    offset += (uint)file.FileSize;
                    file.entry.endOffset = offset;
                    offset = (uint)((offset + 0x7f) & ~0x7f);
                }
                bw.BaseStream.Position = dataOffset;
                data.Position          = 0;
                data.CopyTo(bw.BaseStream);

                //FAT
                bw.BaseStream.Position = 0x10;
                bw.WriteStruct(fatHeader);
                foreach (var file in Files)
                {
                    bw.WriteStruct(file.entry);
                }

                //FNT
                bw.WriteStruct(fntHeader);
                bw.Write(nameP);

                //GMIF
                gmifHeader.secSize = (uint)(bw.BaseStream.Length - dataOffset + 8);
                bw.WriteStruct(gmifHeader);

                //GenHeader
                bw.BaseStream.Position = 0;
                genHeader.secSize      = (uint)(bw.BaseStream.Length);
                bw.WriteStruct(genHeader);
            }
        }
示例#13
0
        public void Save(string filename)
        {
            //check original sizes
            int bmpCount = 0;

            foreach (var txobj in TxObs)
            {
                for (int j = 0; j < ((txobj.mipmapLvls == 0) ? 1 : txobj.mipmapLvls); j++)
                {
                    if (bmps[bmpCount].Width != txobj.width / (1 << j) || bmps[bmpCount].Height != txobj.height / (1 << j))
                    {
                        throw new Exception($"Image {bmpCount:00} has to be {txobj.width / (1 << j)}x{txobj.height / (1 << j)}px!");
                    }
                    bmpCount++;
                }
            }

            using (var bw = new BinaryWriterX(File.OpenWrite(filename)))
            {
                bw.Write(list);

                bmpCount = 0;
                for (int i = 0; i < TxObs.Count; i++)
                {
                    bw.BaseStream.Position = TxObs[i].texDataOffset;
                    var width  = TxObs[i].width;
                    var height = TxObs[i].height;
                    for (int j = 0; j < ((TxObs[i].mipmapLvls == 0) ? 1 : TxObs[i].mipmapLvls); j++)
                    {
                        var settings = new ImageSettings
                        {
                            Width   = (int)width,
                            Height  = (int)height,
                            Format  = Support.CTRFormat[(byte)TxObs[i].format],
                            Swizzle = new CTRSwizzle((int)width, (int)height)
                        };

                        bw.Write(Common.Save(bmps[bmpCount++], settings));

                        width  /= 2;
                        height /= 2;
                    }
                }
            }
        }
示例#14
0
文件: XI.cs 项目: Moonstriker/Kuriimu
        public static void Save(string filename, Bitmap bitmap)
        {
            int width  = (bitmap.Width + 0x7) & ~0x7;
            int height = (bitmap.Height + 0x7) & ~0x7;

            var settings = new ImageSettings
            {
                Width         = width,
                Height        = height,
                Orientation   = Orientation.TransposeTile,
                Format        = ImageSettings.ConvertFormat(header.imageFormat),
                PadToPowerOf2 = false
            };

            byte[] pic = Common.Save(bitmap, settings);

            using (var bw = new BinaryWriterX(File.Create(filename)))
            {
                //Header
                header.width  = (short)bitmap.Width;
                header.height = (short)bitmap.Height;

                //tile table
                var    table     = new MemoryStream();
                byte[] importPic = Deflate(pic, ImageSettings.ConvertFormat(header.imageFormat), out table);

                //Table
                bw.BaseStream.Position = 0x48;
                var comp = Level5.Compress(table, tableComp);
                bw.Write(comp);
                header.tableSize1 = comp.Length + 4;
                header.tableSize2 = (header.tableSize1 + 3) & ~3;

                //Image
                bw.BaseStream.Position = 0x48 + header.tableSize2;
                header.imageFormat     = (editMode) ? Format.ETC1 : header.imageFormat;
                comp = Level5.Compress(new MemoryStream(importPic), picComp);
                bw.Write(comp);
                header.imgDataSize = comp.Length;

                //Header
                bw.BaseStream.Position = 0;
                bw.WriteStruct(header);
            }
        }
示例#15
0
        public void Save(string filename)
        {
            var sjis = Encoding.GetEncoding("Shift-JIS");

            using (BinaryWriterX bw = new BinaryWriterX(File.Create(filename)))
            {
                //Table 0
                bw.BaseStream.Position = 0x14;
                bw.WriteMultipleCompressed(entries, table0Comp);
                bw.WriteAlignment(4);

                //Table 1
                header.table1Offset = (int)bw.BaseStream.Position >> 2;

                uint relOffset = 0;
                var  count     = 1;
                foreach (var label in Labels)
                {
                    var byteCount  = (uint)sjis.GetByteCount(label.Text) + 1;
                    var entryValue = subEntries[label.TextID].value;
                    foreach (var entry in subEntries)
                    {
                        if (entry.ident == 0x18 && entry.value == entryValue)
                        {
                            entry.value = relOffset;
                        }
                    }
                    relOffset += byteCount;
                    count++;
                }
                offsets = subEntries.Where(e => e.ident == 0x18).Select(e => e.value).Distinct().ToList();

                bw.WriteMultipleCompressed(subEntries, table1Comp);
                bw.WriteAlignment(4);

                //Text
                header.stringTableOffset = (int)bw.BaseStream.Position >> 2;
                bw.WriteStringsCompressed(Labels.Select(l => l.Text), stringComp, sjis);
                bw.WriteAlignment(4);

                //Header
                bw.BaseStream.Position = 0;
                bw.WriteStruct(header);
            }
        }
示例#16
0
文件: Dpk.cs 项目: obluda3/Kuriimu2
        public void Save(Stream output, IList <IArchiveFileInfo> files)
        {
            using var bw = new BinaryWriterX(output);

            // Calculate offsets
            var entryOffset = BlockSize;
            var fileOffset  = entryOffset + files.Count * BlockSize;

            // Write files
            // HINT: Files are ordered by name
            var entries = new List <DpkEntry>();

            var filePosition = fileOffset;

            foreach (var file in files.OrderBy(x => x.FilePath.ToRelative().FullName).Cast <ArchiveFileInfo>())
            {
                output.Position = filePosition;
                var writtenSize = file.SaveFileData(output);

                var name = CapAndPadName(file.FilePath.ToRelative().FullName);
                entries.Add(new DpkEntry
                {
                    name       = name,
                    nameSum    = (short)NameSum(name),
                    offset     = filePosition,
                    compSize   = (int)writtenSize,
                    decompSize = (int)file.FileSize
                });

                filePosition += (int)((writtenSize + (BlockSize - 1)) & ~(BlockSize - 1));
            }

            // Write entries
            // HINT: Entries are ordered by nameSum
            output.Position = entryOffset;
            bw.WriteMultiple(entries.OrderBy(x => x.nameSum));

            // Write header
            output.Position = 0;
            bw.WriteType(new DpkHeader
            {
                fileCount = files.Count,
                fileSize  = (int)output.Length
            });
        }
示例#17
0
        public static void Decrypt(object sender, EventArgs e)
        {
            var tsi  = sender as ToolStripMenuItem;
            var name = (tsi.Tag.ToString() == "normal") ? "3DS" : tsi.Tag.ToString();

            if (!PrepareFiles("Open an encrypted " + name + " file...", "Save your decrypted file...", ".dec", out FileStream openFile, out FileStream saveFile))
            {
                return;
            }

            try
            {
                using (var openBr = new BinaryReaderX(openFile))
                    using (var outFs = new BinaryWriterX(saveFile))
                    {
                        var engine = new AesEngine();
                        switch (tsi.Tag)
                        {
                        case Types.normal:
                            openBr.BaseStream.CopyTo(outFs.BaseStream);
                            openBr.BaseStream.Position = 0;
                            outFs.BaseStream.Position  = 0;
                            engine.DecryptGameNCSD(openBr.BaseStream, outFs.BaseStream);
                            break;

                        case Types.CIA:
                            openBr.BaseStream.CopyTo(outFs.BaseStream);
                            openBr.BaseStream.Position = 0;
                            outFs.BaseStream.Position  = 0;
                            engine.DecryptCIA(openBr.BaseStream, outFs.BaseStream);
                            break;

                            /*case Types.BOSS:
                             *  outFs.Write(engine.DecryptBOSS(openBr.ReadBytes((int)openBr.BaseStream.Length)));
                             *  break;*/
                        }
                    }
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.ToString(), tsi?.Text, MessageBoxButtons.OK, MessageBoxIcon.Error);
            }

            MessageBox.Show($"Successfully decrypted {Path.GetFileName(openFile.Name)}.", tsi?.Text, MessageBoxButtons.OK, MessageBoxIcon.Information);
        }
示例#18
0
        public byte[] Deflate(byte[] pic, int bpp, out MemoryStream table)
        {
            table = new MemoryStream();
            using (var tableB = new BinaryWriterX(table, true))
            {
                if (entryStart != null)
                {
                    tableB.Write(entryStart);
                }

                List <byte[]> parts = new List <byte[]>();

                using (var picB = new BinaryReaderX(new MemoryStream(pic)))
                    while (picB.BaseStream.Position < picB.BaseStream.Length)
                    {
                        byte[] part = picB.ReadBytes(64 * bpp / 8);

                        if (parts.Find(x => x.SequenceEqual(part)) != null)
                        {
                            if (entryStart != null)
                            {
                                tableB.Write(parts.FindIndex(x => x.SequenceEqual(part)));
                            }
                            else
                            {
                                tableB.Write((short)parts.FindIndex(x => x.SequenceEqual(part)));
                            }
                        }
                        else
                        {
                            if (entryStart != null)
                            {
                                tableB.Write(parts.Count);
                            }
                            else
                            {
                                tableB.Write((short)parts.Count);
                            }
                            parts.Add(part);
                        }
                    }

                return(parts.SelectMany(x => x.SelectMany(b => new[] { b })).ToArray());
            }
        }
示例#19
0
        public void Save(Stream output, IList <IArchiveFileInfo> files)
        {
            using var bw = new BinaryWriterX(output);

            // Calculate offsets
            var dataAlignment = PkgSupport.DetermineAlignment((files[0] as PkgArchiveFileInfo).Type);
            var entryOffset   = HeaderSize;
            var dataOffset    = (entryOffset + files.Count * EntrySize + dataAlignment - 1) & ~(dataAlignment - 1);

            // Write files
            var entries = new List <PkgEntry>();

            var dataPosition = dataOffset;

            foreach (var file in files.Cast <PkgArchiveFileInfo>())
            {
                // Write file data
                var alignment           = PkgSupport.DetermineAlignment(file.Type);
                var alignedDataPosition = (dataPosition + alignment - 1) & ~(alignment - 1);

                output.Position = alignedDataPosition;
                var writtenSize = file.SaveFileData(output);

                // Create entry
                entries.Add(new PkgEntry
                {
                    startOffset = alignedDataPosition,
                    endOffset   = (int)(alignedDataPosition + writtenSize),
                    hash        = file.Hash
                });

                dataPosition = (int)(alignedDataPosition + writtenSize);
            }
            bw.WriteAlignment(4);

            // Write entries
            output.Position = entryOffset;
            bw.WriteMultiple(entries);

            // Write header
            output.Position = 0;
            bw.WriteType(new PkgHeader {
                fileCount = files.Count, tableSize = dataOffset - 4, dataSize = (int)(output.Length - dataOffset)
            });
        }
示例#20
0
        public static void Save(string filename, Bitmap bitmap)
        {
            int width  = (bitmap.Width + 0x7) & ~0x7;
            int height = (bitmap.Height + 0x7) & ~0x7;

            var settings = new ImageSettings
            {
                Width         = width,
                Height        = height,
                Format        = ImageSettings.ConvertFormat(header.imageFormat),
                PadToPowerOf2 = false,
                ZOrder        = false
            };

            byte[] pic = Common.Save(bitmap, settings);

            using (var bw = new BinaryWriterX(File.Create(filename)))
            {
                //Header
                header.bitDepth = 32;
                header.width    = (short)width;
                header.height   = (short)height;

                //tile table
                List <short> table;
                byte[]       importPic = Deflate(pic, out table);

                header.width       = (short)bitmap.Width;
                header.height      = (short)bitmap.Height;
                header.tableSize1  = table.Count * 2 + 4;
                header.tableSize2  = (header.tableSize1 + 3) & ~3;
                header.imgDataSize = importPic.Length + 4;
                bw.WriteStruct(header);

                bw.Write(header.tableSize1 << 3);
                foreach (var tableEntry in table)
                {
                    bw.Write(tableEntry);
                }

                bw.BaseStream.Position = 0x48 + header.tableSize2;
                bw.Write(header.imgDataSize << 3);
                bw.Write(importPic);
            }
        }
示例#21
0
        public void Save(string filename)
        {
            using (BinaryWriterX bw = new BinaryWriterX(File.Create(filename)))
            {
                bw.BaseStream.Position = header.texDataOffset;
                var count = 0;
                for (int i = 0; i < header.chunkCount; i++)
                {
                    for (int j = 0; j < chunks[i].texCount; j++)
                    {
                        settingsList[count] = new ImageSettings
                        {
                            Width   = bmps[count].Width,
                            Height  = bmps[count].Height,
                            Format  = Support.Format[chunks[i].textures[j].imageFormat],
                            Swizzle = new CTRSwizzle(bmps[count].Width, bmps[count].Height)
                        };

                        var resBmp = Kontract.Image.Common.Save(bmps[count], settingsList[count]);
                        bw.Write(resBmp);

                        chunks[i].textures[j].dataLength = resBmp.Length;
                        chunks[i].textures[j].height     = (ushort)bmps[count].Height;
                        chunks[i].textures[j].width      = (ushort)bmps[count].Width;

                        count++;
                    }
                }

                //Ctxb Header
                header.fileSize        = (uint)bw.BaseStream.Length;
                bw.BaseStream.Position = 0;
                bw.WriteStruct(header);

                //Chunks
                for (int i = 0; i < header.chunkCount; i++)
                {
                    chunks[i].Write(bw.BaseStream);
                    for (int j = 0; j < chunks[i].texCount; j++)
                    {
                        bw.WriteStruct(chunks[i].textures[j]);
                    }
                }
            }
        }
示例#22
0
        public void WriteToHpb(Stream stream)
        {
            Entry.fileOffset = (int)stream.Position;
            if (State == ArchiveFileState.Replaced && Entry.uncompressedSize != 0)
            {
                // Only here if we need to compress from a FileStream in the base.FileData
                var uncompData = new byte[_fileData.Length];
                base.FileData.Read(uncompData, 0, uncompData.Length);
                var compData = RevLZ77.Compress(new MemoryStream(uncompData));
                if (compData == null)
                {
                    Entry.fileSize         = uncompData.Length;
                    Entry.uncompressedSize = 0;
                    using (var bw = new BinaryWriterX(stream, true))
                    {
                        bw.Write(uncompData);
                    }
                }
                else
                {
                    Entry.fileSize         = compData.Length + 0x20;
                    Entry.uncompressedSize = uncompData.Length;
                    using (var bw = new BinaryWriterX(stream, true))
                    {
                        bw.WriteStruct(new AcmpHeader
                        {
                            compressedSize   = Entry.fileSize,
                            uncompressedSize = Entry.uncompressedSize
                        });
                        bw.Write(compData);
                    }
                }
            }
            else
            {
                Entry.fileSize = (int)_fileData.Length;
                base.FileData.CopyTo(stream);
            }

            // padding
            while (stream.Position % 4 != 0)
            {
                stream.WriteByte(0);
            }
        }
示例#23
0
        private void WriteTypeClass(BinaryWriterX bw, object writeValue, Type writeType, ValueStorage storage)
        {
            var typeAttributes = new MemberAttributeInfo(writeType);

            var bitFieldInfoAttribute = typeAttributes.BitFieldInfoAttribute;
            var alignmentAttribute    = typeAttributes.AlignmentAttribute;

            if (bitFieldInfoAttribute != null)
            {
                bw.Flush();
            }

            bw.BitOrder  = (bitFieldInfoAttribute?.BitOrder != BitOrder.Default ? bitFieldInfoAttribute?.BitOrder : bw.BitOrder) ?? bw.BitOrder;
            bw.BlockSize = bitFieldInfoAttribute?.BlockSize ?? bw.BlockSize;
            if (bw.BlockSize != 8 && bw.BlockSize != 4 && bw.BlockSize != 2 && bw.BlockSize != 1)
            {
                throw new InvalidBitFieldInfoException(bw.BlockSize);
            }

            var fields = writeType.GetFields().OrderBy(fi => fi.MetadataToken);

            foreach (var field in fields)
            {
                var fieldValue = field.GetValue(writeValue);
                storage.Add(field.Name, fieldValue);

                var bitInfo = field.GetCustomAttribute <BitFieldAttribute>();
                if (bitInfo != null)
                {
                    bw.WriteBits(Convert.ToInt64(fieldValue), bitInfo.BitLength);
                }
                else
                {
                    WriteTypeInternal(bw, fieldValue, storage, field);
                }
            }

            bw.Flush();

            // Apply alignment
            if (alignmentAttribute != null)
            {
                bw.WriteAlignment(alignmentAttribute.Alignment);
            }
        }
示例#24
0
        public void Save(Stream output)
        {
            var headerSize = 0x10;
            var entrySize  = 0x28;

            using (var bw = new BinaryWriterX(output))
            {
                bw.WriteStruct(Header);

                // Strings
                bw.BaseStream.Position = headerSize + Header.EntryCount * entrySize;
                var strEntries = Entries.Where(e => e.Offset > 0).ToList();

                var offset = (int)bw.BaseStream.Position;
                for (var i = 0; i < strEntries.Count; i++)
                {
                    var entry = strEntries[i];
                    if (entry.Label == "<label>")
                    {
                        bw.WriteASCII(Strings[i].Text);
                        bw.Write((byte)0x0);
                    }
                    else
                    {
                        bw.Write(Encoding.Unicode.GetBytes(Strings[i].Text));
                        bw.Write((byte)0x0);
                        bw.Write((byte)0x0);
                    }
                    bw.WriteAlignment(4);
                    entry.Offset = offset;
                    offset       = (int)bw.BaseStream.Position;
                }

                // Odd extra bytes
                bw.Write(0);
                bw.Write((byte)0x0);

                // Entries
                bw.BaseStream.Position = headerSize;
                foreach (var entry in Entries)
                {
                    bw.WriteStruct(entry);
                }
            }
        }
示例#25
0
文件: AATRI.cs 项目: wabberz/Kuriimu
 public void Save(Stream incOutput, Stream datOutput)
 {
     using (var bwd = new BinaryWriterX(datOutput))
     {
         for (int i = 0; i < Files.Count; i++)
         {
             Files[i].Write(bwd.BaseStream);
             bwd.WriteAlignment(4);
         }
     }
     using (var bw = new BinaryWriterX(incOutput))
     {
         foreach (var file in Files)
         {
             bw.WriteStruct(file.Entry);
         }
     }
 }
示例#26
0
            public void Write(Stream input)
            {
                using (var bw = new BinaryWriterX(input, true, ByteOrder.BigEndian))
                {
                    bw.Write(sigType);
                    bw.Write(signature);
                    bw.WritePadding(Support.GetSignatureSizes(sigType).Item2);

                    bw.Write(GetFixedStringBA(issuer, 0x40));

                    bw.Write(keyType);
                    bw.Write(GetFixedStringBA(name, 0x40));

                    bw.Write(publicKey);
                    bw.Write(unk1);
                    bw.WritePadding(Support.GetPublicKeySizes(keyType).Item2);
                }
            }
示例#27
0
        public void Save(Stream output)
        {
            using (var bw = new BinaryWriterX(output))
            {
                var dataOffset = entries[0].offset;

                foreach (var file in Files)
                {
                    bw.Write(dataOffset);

                    file.Write(bw.BaseStream, dataOffset);

                    dataOffset = (uint)bw.BaseStream.Length;
                }

                bw.Write(dataOffset);
            }
        }
示例#28
0
        public int Write(Stream input, int absDataOffset, int baseDataOffset)
        {
            using (var bw = new BinaryWriterX(input, true))
            {
                bw.BaseStream.Position = absDataOffset;
                FileData.CopyTo(bw.BaseStream);
                if (bw.BaseStream.Position % 4 > 0) bw.WriteAlignment(4);
                else bw.WritePadding(4);

                var relOffset = absDataOffset - baseDataOffset;
                Entry.tmp = (ushort)((relOffset >> 2) & 0xffff);
                Entry.tmpZ = (byte)(((relOffset >> 2) & 0xff0000) >> 16);
                Entry.tmp2 = (ushort)(FileSize & 0xffff);
                Entry.tmp2Z = (byte)((FileSize & 0xff0000) >> 16);

                return (bw.BaseStream.Position % 4 > 0) ? (int)(absDataOffset + FileSize + 0x3) & ~0x3 : (int)(absDataOffset + FileSize + 4);
            }
        }
        public byte[] Save(IEnumerable <Color> colors, int taskCount)
        {
            var ms = new MemoryStream();

            using var bw = new BinaryWriterX(ms, _byteOrder);

            var blocks = colors.Batch(ColorsPerValue)
                         .AsParallel().AsOrdered()
                         .WithDegreeOfParallelism(taskCount)
                         .Select(c => EncodeNextBlock(c.ToArray()));

            foreach (var block in blocks)
            {
                WriteNextBlock(bw, block);
            }

            return(ms.ToArray());
        }
示例#30
0
        public void NibbleWriting()
        {
            var expect = new byte[] {
                0x84, 0x08
            };
            var ms = new MemoryStream();

            using (var bw = new BinaryWriterX(ms))
            {
                bw.WriteNibble(0x04);
                bw.WriteNibble(0x08);

                bw.WriteNibble(0x08);
                bw.Flush();

                Assert.IsTrue(ms.ToArray().SequenceEqual(expect));
            }
        }
示例#31
0
        public void Save(Stream file)
        {
            int width    = (Image.Width + 0x7) & ~0x7;
            int height   = (Image.Height + 0x7) & ~0x7;
            var settings = new ImageSettings
            {
                Width   = width,
                Height  = height,
                Format  = Support.Format[header.imageFormat],
                Swizzle = new ImgcSwizzle(width, height)
            };

            byte[] pic = L5XFEditor.Image.Common.Save(Image, settings);

            using (var bw = new BinaryWriterX(file, true))
            {
                //Header
                header.width  = (short)Image.Width;
                header.height = (short)Image.Height;

                //tile table
                var    table     = new MemoryStream();
                byte[] importPic = Deflate(pic, Support.Format[header.imageFormat].BitDepth, out table);

                //Table
                bw.BaseStream.Position = 0x48;
                var comp = Level5.Compress(table, tableComp);
                bw.Write(comp);
                header.tableSize1 = comp.Length;
                header.tableSize2 = (header.tableSize1 + 3) & ~3;

                //Image
                bw.BaseStream.Position = 0x48 + header.tableSize2;
                header.imageFormat     = (editMode) ? (byte)28 : header.imageFormat;
                comp = Level5.Compress(new MemoryStream(importPic), picComp);
                bw.Write(comp);
                bw.WriteAlignment(4);
                header.imgDataSize = comp.Length;

                //Header
                bw.BaseStream.Position = 0;
                bw.WriteStruct(header);
            }
        }