コード例 #1
0
 public BinaryDataBuffer(byte[] buffer, ByteOrderEnum byteOrder = ByteOrderEnum.LittleEndian)
 {
     _buffer   = buffer;
     ByteOrder = byteOrder;
     Converter = new EndianBitConverter();
     Converter.IsLittleEndian = byteOrder == ByteOrderEnum.LittleEndian;
 }
コード例 #2
0
        public static XmlDocument ReadBytes(byte[] inBytes, ByteOrderEnum byteOrder = ByteOrderEnum.AutoDetect, Boolean writeLog = false)
        {
            Stream ms = new MemoryStream(inBytes);


            return(CryXmlSerializer.ReadStream(ms, byteOrder, writeLog));
        }
コード例 #3
0
 public static int ByteArrayToInt(
     byte[] data,
     int index,
     ByteOrderEnum byteOrder
     )
 {
     return(ByteArrayToNumber(data, index, 4, byteOrder));
 }
コード例 #4
0
   public static int ByteArrayToInt(
 byte[] data,
 int index,
 ByteOrderEnum byteOrder
 )
   {
       return ByteArrayToNumber(data,index,4,byteOrder);
   }
コード例 #5
0
 public static byte[] NumberToByteArray(int data, int length, ByteOrderEnum byteOrder)
 {
     byte[] result = new byte[length];
     for (int index = 0; index < length; index++)
     {
         result[index] = (byte)(data >> 8 * (byteOrder == ByteOrderEnum.LittleEndian ? index : length - index - 1));
     }
     return(result);
 }
コード例 #6
0
        public static int ByteArrayToNumber(byte[] data, int index, int length, ByteOrderEnum byteOrder)
        {
            int value = 0;

            length = (int)System.Math.Min(length, data.Length - index);
            for (int i = index, endIndex = index + length; i < endIndex; i++)
            {
                value |= (data[i] & 0xff) << 8 * (byteOrder == ByteOrderEnum.LittleEndian ? i - index : endIndex - i - 1);
            }
            return(value);
        }
コード例 #7
0
        internal static long ByteArrayToLong(byte[] data, int position, int size, ByteOrderEnum byteOrder)
        {
            var buffer = new byte[size];

            data.CopyTo(buffer, position);
            if (byteOrder == ByteOrderEnum.BigEndian)
            {
                Array.Reverse(data);
            }
            return(BitConverter.ToInt64(data, position));
        }
コード例 #8
0
    private T FromBytes <T>(Func <byte[], int, T> converterOverload, int position, IValue byteOrder = null) where T : struct
    {
        ByteOrderEnum order = ByteOrder;

        if (byteOrder != null)
        {
            order = ((CLREnumValueWrapper <ByteOrderEnum>)byteOrder.GetRawValue()).UnderlyingValue;
        }

        Converter.IsLittleEndian = order == ByteOrderEnum.LittleEndian;

        return(converterOverload(_buffer, position));
    }
コード例 #9
0
        //public static ulong ReadUInt64(this BinaryReader br, ByteOrderEnum byteOrder = ByteOrderEnum.BigEndian)
        //{
        //  var bytes = new byte[] {
        //            br.ReadByte(),
        //            br.ReadByte(),
        //            br.ReadByte(),
        //            br.ReadByte(),
        //            br.ReadByte(),
        //            br.ReadByte(),
        //            br.ReadByte(),
        //            br.ReadByte(),
        //        };

        //  if (byteOrder == ByteOrderEnum.LittleEndian)
        //    bytes = bytes.Reverse().ToArray();

        //  return BitConverter.ToUInt64(bytes, 0);
        //}

        public static uint ReadUInt32(this BinaryReader r,
                                      ByteOrderEnum byteOrder = ByteOrderEnum.BigEndian)
        {
            var bytes = new[] { r.ReadByte(), r.ReadByte(), r.ReadByte(), r.ReadByte() };

            if (byteOrder == ByteOrderEnum.LittleEndian)
            {
                bytes = bytes.Reverse()
                        .ToArray();
            }

            return(BitConverter.ToUInt32(bytes, 0));
        }
コード例 #10
0
        public static Int16 ReadInt16(this BinaryReader br, ByteOrderEnum byteOrder = ByteOrderEnum.BigEndian)
        {
            var bytes = new Byte[] {
                br.ReadByte(),
                br.ReadByte(),
            };

            if (byteOrder == ByteOrderEnum.LittleEndian)
            {
                bytes = bytes.Reverse().ToArray();
            }

            return(BitConverter.ToInt16(bytes, 0));
        }
コード例 #11
0
        public static TObject Deserialize <TObject>(String inFile, ByteOrderEnum byteOrder = ByteOrderEnum.BigEndian, Boolean writeLog = false) where TObject : class
        {
            using (MemoryStream ms = new MemoryStream())
            {
                var xmlDoc = CryXmlSerializer.ReadFile(inFile, byteOrder, writeLog);

                xmlDoc.Save(ms);

                ms.Seek(0, SeekOrigin.Begin);

                XmlSerializer xs = new XmlSerializer(typeof(TObject));

                return(xs.Deserialize(ms) as TObject);
            }
        }
コード例 #12
0
        public static XmlDocument ReadStream(Stream inStream, ByteOrderEnum byteOrder = ByteOrderEnum.AutoDetect, Boolean writeLog = false)
        {
            using (BinaryReader br = new BinaryReader(inStream))
            {
                var peek = br.PeekChar();

                if (peek == '<')
                {
                    return(null); // File is already XML
                }
                else if (peek != 'C')
                {
                    throw new Exception("Unknown File Format"); // Unknown file format
                }

                String header = br.ReadFString(7);

                if (header == "CryXml" || header == "CryXmlB")
                {
                    br.ReadCString();
                }
                else if (header == "CRY3SDK")
                {
                    var bytes = br.ReadBytes(2);
                }
                else
                {
                    throw new Exception("Unknown File Format");
                }

                var headerLength = br.BaseStream.Position;

                byteOrder = ByteOrderEnum.BigEndian;

                var fileLength = br.ReadInt32(byteOrder);

                if (fileLength != br.BaseStream.Length)
                {
                    br.BaseStream.Seek(headerLength, SeekOrigin.Begin);
                    byteOrder  = ByteOrderEnum.LittleEndian;
                    fileLength = br.ReadInt32(byteOrder);
                }

                var nodeTableOffset = br.ReadInt32(byteOrder);
                var nodeTableCount  = br.ReadInt32(byteOrder);
                var nodeTableSize   = 28;

                var referenceTableOffset = br.ReadInt32(byteOrder);
                var referenceTableCount  = br.ReadInt32(byteOrder);
                var referenceTableSize   = 8;

                var offset3 = br.ReadInt32(byteOrder);
                var count3  = br.ReadInt32(byteOrder);
                var length3 = 4;

                var contentOffset = br.ReadInt32(byteOrder);
                var contentLength = br.ReadInt32(byteOrder);

                if (writeLog)
                {
                    // Regex byteFormatter = new Regex("([0-9A-F]{8})");
                    Console.WriteLine("Header");
                    Console.WriteLine("0x{0:X6}: {1}", 0x00, header);
                    Console.WriteLine("0x{0:X6}: {1:X8} (Dec: {1:D8})", headerLength + 0x00, fileLength);
                    Console.WriteLine("0x{0:X6}: {1:X8} (Dec: {1:D8})", headerLength + 0x04, nodeTableOffset);
                    Console.WriteLine("0x{0:X6}: {1:X8} (Dec: {1:D8})", headerLength + 0x08, nodeTableCount);
                    Console.WriteLine("0x{0:X6}: {1:X8} (Dec: {1:D8})", headerLength + 0x12, referenceTableOffset);
                    Console.WriteLine("0x{0:X6}: {1:X8} (Dec: {1:D8})", headerLength + 0x16, referenceTableCount);
                    Console.WriteLine("0x{0:X6}: {1:X8} (Dec: {1:D8})", headerLength + 0x20, offset3);
                    Console.WriteLine("0x{0:X6}: {1:X8} (Dec: {1:D8})", headerLength + 0x24, count3);
                    Console.WriteLine("0x{0:X6}: {1:X8} (Dec: {1:D8})", headerLength + 0x28, contentOffset);
                    Console.WriteLine("0x{0:X6}: {1:X8} (Dec: {1:D8})", headerLength + 0x32, contentLength);
                    Console.WriteLine("");
                    Console.WriteLine("Node Table");
                }

                List <CryXmlNode> nodeTable = new List <CryXmlNode> {
                };
                br.BaseStream.Seek(nodeTableOffset, SeekOrigin.Begin);
                Int32 nodeID = 0;
                while (br.BaseStream.Position < nodeTableOffset + nodeTableCount * nodeTableSize)
                {
                    var position = br.BaseStream.Position;
                    var value    = new CryXmlNode
                    {
                        NodeID              = nodeID++,
                        NodeNameOffset      = br.ReadInt32(byteOrder),
                        ItemType            = br.ReadInt32(byteOrder),
                        AttributeCount      = br.ReadInt16(byteOrder),
                        ChildCount          = br.ReadInt16(byteOrder),
                        ParentNodeID        = br.ReadInt32(byteOrder),
                        FirstAttributeIndex = br.ReadInt32(byteOrder),
                        FirstChildIndex     = br.ReadInt32(byteOrder),
                        Reserved            = br.ReadInt32(byteOrder),
                    };

                    nodeTable.Add(value);
                    if (writeLog)
                    {
                        Console.WriteLine(
                            "0x{0:X6}: {1:X8} {2:X8} {3:X4} {4:X4} {5:X8} {6:X8} {7:X8} {8:X8}",
                            position,
                            value.NodeNameOffset,
                            value.ItemType,
                            value.AttributeCount,
                            value.ChildCount,
                            value.ParentNodeID,
                            value.FirstAttributeIndex,
                            value.FirstChildIndex,
                            value.Reserved);
                    }
                }

                if (writeLog)
                {
                    Console.WriteLine("");
                    Console.WriteLine("Reference Table");
                }

                List <CryXmlReference> attributeTable = new List <CryXmlReference> {
                };
                br.BaseStream.Seek(referenceTableOffset, SeekOrigin.Begin);
                while (br.BaseStream.Position < referenceTableOffset + referenceTableCount * referenceTableSize)
                {
                    var position = br.BaseStream.Position;
                    var value    = new CryXmlReference
                    {
                        NameOffset  = br.ReadInt32(byteOrder),
                        ValueOffset = br.ReadInt32(byteOrder)
                    };

                    attributeTable.Add(value);
                    if (writeLog)
                    {
                        Console.WriteLine("0x{0:X6}: {1:X8} {2:X8}", position, value.NameOffset, value.ValueOffset);
                    }
                }
                if (writeLog)
                {
                    Console.WriteLine("");
                    Console.WriteLine("Order Table");
                }

                List <Int32> table3 = new List <Int32> {
                };
                br.BaseStream.Seek(offset3, SeekOrigin.Begin);
                while (br.BaseStream.Position < offset3 + count3 * length3)
                {
                    var position = br.BaseStream.Position;
                    var value    = br.ReadInt32(byteOrder);

                    table3.Add(value);
                    if (writeLog)
                    {
                        Console.WriteLine("0x{0:X6}: {1:X8}", position, value);
                    }
                }

                if (writeLog)
                {
                    Console.WriteLine("");
                    Console.WriteLine("Dynamic Dictionary");
                }

                List <CryXmlValue> dataTable = new List <CryXmlValue> {
                };
                br.BaseStream.Seek(contentOffset, SeekOrigin.Begin);
                while (br.BaseStream.Position < br.BaseStream.Length)
                {
                    var position = br.BaseStream.Position;
                    var value    = new CryXmlValue
                    {
                        Offset = (Int32)position - contentOffset,
                        Value  = br.ReadCString(),
                    };
                    dataTable.Add(value);
                    if (writeLog)
                    {
                        Console.WriteLine("0x{0:X6}: {1:X8} {2}", position, value.Offset, value.Value);
                    }
                }

                var dataMap = dataTable.ToDictionary(k => k.Offset, v => v.Value);

                var attributeIndex = 0;

                var xmlDoc = new XmlDocument();

                var bugged = false;

                Dictionary <Int32, XmlElement> xmlMap = new Dictionary <Int32, XmlElement> {
                };
                foreach (var node in nodeTable)
                {
                    XmlElement element = xmlDoc.CreateElement(dataMap[node.NodeNameOffset]);

                    for (Int32 i = 0, j = node.AttributeCount; i < j; i++)
                    {
                        if (dataMap.ContainsKey(attributeTable[attributeIndex].ValueOffset))
                        {
                            element.SetAttribute(dataMap[attributeTable[attributeIndex].NameOffset], dataMap[attributeTable[attributeIndex].ValueOffset]);
                        }
                        else
                        {
                            bugged = true;
                            element.SetAttribute(dataMap[attributeTable[attributeIndex].NameOffset], "BUGGED");
                        }
                        attributeIndex++;
                    }

                    xmlMap[node.NodeID] = element;
                    if (xmlMap.ContainsKey(node.ParentNodeID))
                    {
                        xmlMap[node.ParentNodeID].AppendChild(element);
                    }
                    else
                    {
                        xmlDoc.AppendChild(element);
                    }
                }

                return(xmlDoc);
            }
        }
コード例 #13
0
 public static XmlDocument ReadFile(String inFile, ByteOrderEnum byteOrder = ByteOrderEnum.AutoDetect, Boolean writeLog = false)
 {
     return(CryXmlSerializer.ReadStream(File.OpenRead(inFile), byteOrder, writeLog));
 }
コード例 #14
0
 public БуферДвоичныхДанных(byte[] buffer, ByteOrderEnum byteOrder = ByteOrderEnum.LittleEndian)
 {
     _buffer   = buffer;
     ByteOrder = byteOrder;
 }
コード例 #15
0
 public BinaryDataBuffer(byte[] buffer, ByteOrderEnum byteOrder = ByteOrderEnum.LittleEndian)
 {
     _buffer   = buffer;
     ByteOrder = byteOrder;
 }
コード例 #16
0
   public static byte[] NumberToByteArray(
 int data,
 int length,
 ByteOrderEnum byteOrder
 )
   {
       byte[] result = new byte[length];
         for(
       int index = 0;
       index < length;
       index++
       )
         {result[index] = (byte)(data >> 8 * (byteOrder == ByteOrderEnum.LittleEndian ? index : length-index-1));}
         return result;
   }
コード例 #17
0
        public static XmlDocument ReadStream(Stream stream,
                                             ByteOrderEnum byteOrder = ByteOrderEnum.AutoDetect,
                                             bool writeLog           = false)
        {
            using (BinaryReader r = new BinaryReader(stream))
            {
                var peek = r.PeekChar();

                if (peek == '<')
                {
                    return(null); // File is already XML
                }

                if (peek != 'C')
                {
                    throw new FormatException("Unknown File Format");
                }

                string header = r.ReadFString(7);

                if (header == "CryXml" || header == "CryXmlB")
                {
                    r.ReadCString();
                }
                else if (header == "CRY3SDK")
                {
                    var bytes = r.ReadBytes(2);
                }
                else
                {
                    throw new FormatException("Unknown File Format");
                }

                var headerLength = r.BaseStream.Position;

                byteOrder = ByteOrderEnum.BigEndian;

                var fileLength = r.ReadInt(byteOrder);

                if (fileLength != r.BaseStream.Length)
                {
                    r.BaseStream.Seek(headerLength, SeekOrigin.Begin);
                    byteOrder  = ByteOrderEnum.LittleEndian;
                    fileLength = r.ReadInt(byteOrder);
                }

                var nodeTableOffset = r.ReadInt(byteOrder);
                var nodeTableCount  = r.ReadInt(byteOrder);
                var nodeTableSize   = 28;

                var attributeTableOffset = r.ReadInt(byteOrder);
                var attributeTableCount  = r.ReadInt(byteOrder);
                var referenceTableSize   = 8;

                var childTableOffset = r.ReadInt(byteOrder);
                var childTableCount  = r.ReadInt(byteOrder);
                var length3          = 4;

                var stringTableOffset = r.ReadInt(byteOrder);
                var stringTableCount  = r.ReadInt(byteOrder);

                if (writeLog)
                {
                    // Regex byteFormatter = new Regex("([0-9A-F]{8})");
                    Console.WriteLine("Header");
                    Console.WriteLine("0x{0:X6}: {1}", 0x00, header);
                    Console.WriteLine("0x{0:X6}: {1:X8} (Dec: {1:D8})", headerLength + 0x00, fileLength);
                    Console.WriteLine("0x{0:X6}: {1:X8} (Dec: {1:D8}) node offset",
                                      headerLength + 0x04,
                                      nodeTableOffset);
                    Console.WriteLine("0x{0:X6}: {1:X8} (Dec: {1:D8}) nodes",
                                      headerLength + 0x08,
                                      nodeTableCount);
                    Console.WriteLine("0x{0:X6}: {1:X8} (Dec: {1:D8}) reference offset",
                                      headerLength + 0x12,
                                      attributeTableOffset);
                    Console.WriteLine("0x{0:X6}: {1:X8} (Dec: {1:D8}) references",
                                      headerLength + 0x16,
                                      attributeTableCount);
                    Console.WriteLine("0x{0:X6}: {1:X8} (Dec: {1:D8}) child offset",
                                      headerLength + 0x20,
                                      childTableOffset);
                    Console.WriteLine("0x{0:X6}: {1:X8} (Dec: {1:D8}) child",
                                      headerLength + 0x24,
                                      childTableCount);
                    Console.WriteLine("0x{0:X6}: {1:X8} (Dec: {1:D8}) content offset",
                                      headerLength + 0x28,
                                      stringTableOffset);
                    Console.WriteLine("0x{0:X6}: {1:X8} (Dec: {1:D8}) content",
                                      headerLength + 0x32,
                                      stringTableCount);
                    Console.WriteLine("");
                    Console.WriteLine("Node Table");
                }

                List <CryXmlNode> nodeTable = new List <CryXmlNode>();
                r.BaseStream.Seek(nodeTableOffset, SeekOrigin.Begin);
                int nodeID = 0;
                while (r.BaseStream.Position < nodeTableOffset + nodeTableCount * nodeTableSize)
                {
                    var position = r.BaseStream.Position;
                    var value    = new CryXmlNode
                    {
                        NodeID              = nodeID++,
                        NodeNameOffset      = r.ReadInt(byteOrder),
                        ContentOffset       = r.ReadInt(byteOrder),
                        AttributeCount      = r.ReadInt16(byteOrder),
                        ChildCount          = r.ReadInt16(byteOrder),
                        ParentNodeID        = r.ReadInt(byteOrder),
                        FirstAttributeIndex = r.ReadInt(byteOrder),
                        FirstChildIndex     = r.ReadInt(byteOrder),
                        Reserved            = r.ReadInt(byteOrder)
                    };

                    nodeTable.Add(value);
                    if (writeLog)
                    {
                        Console.WriteLine("0x{0:X6}: {1:X8} {2:X8} attr:{3:X4} {4:X4} {5:X8} {6:X8} {7:X8} {8:X8}",
                                          position,
                                          value.NodeNameOffset,
                                          value.ContentOffset,
                                          value.AttributeCount,
                                          value.ChildCount,
                                          value.ParentNodeID,
                                          value.FirstAttributeIndex,
                                          value.FirstChildIndex,
                                          value.Reserved);
                    }
                }

                if (writeLog)
                {
                    Console.WriteLine("");
                    Console.WriteLine("Reference Table");
                }

                List <CryXmlReference> attributeTable = new List <CryXmlReference>();
                r.BaseStream.Seek(attributeTableOffset, SeekOrigin.Begin);
                while (r.BaseStream.Position
                       < attributeTableOffset + attributeTableCount * referenceTableSize)
                {
                    var position = r.BaseStream.Position;
                    var value    = new CryXmlReference
                    {
                        NameOffset = r.ReadInt(byteOrder), ValueOffset = r.ReadInt(byteOrder)
                    };

                    attributeTable.Add(value);
                    if (writeLog)
                    {
                        Console.WriteLine("0x{0:X6}: {1:X8} {2:X8}",
                                          position,
                                          value.NameOffset,
                                          value.ValueOffset);
                    }
                }

                if (writeLog)
                {
                    Console.WriteLine("");
                    Console.WriteLine("Order Table");
                }

                List <int> parentTable = new List <int>();
                r.BaseStream.Seek(childTableOffset, SeekOrigin.Begin);
                while (r.BaseStream.Position < childTableOffset + childTableCount * length3)
                {
                    var position = r.BaseStream.Position;
                    var value    = r.ReadInt(byteOrder);

                    parentTable.Add(value);
                    if (writeLog)
                    {
                        Console.WriteLine("0x{0:X6}: {1:X8}", position, value);
                    }
                }

                if (writeLog)
                {
                    Console.WriteLine("");
                    Console.WriteLine("Dynamic Dictionary");
                }

                List <CryXmlValue> dataTable = new List <CryXmlValue>();
                r.BaseStream.Seek(stringTableOffset, SeekOrigin.Begin);
                while (r.BaseStream.Position < r.BaseStream.Length)
                {
                    var position = r.BaseStream.Position;
                    var value    = new CryXmlValue
                    {
                        Offset = (int)position - stringTableOffset, Value = r.ReadCString()
                    };

                    dataTable.Add(value);

                    if (writeLog)
                    {
                        Console.WriteLine("0x{0:X6}: {1:X8} {2}", position, value.Offset, value.Value);
                    }
                }

                var dataMap = dataTable.ToDictionary(k => k.Offset, v => v.Value);

                var attributeIndex = 0;

                var xmlDoc = new XmlDocument();

                Dictionary <int, XmlElement> xmlMap = new Dictionary <int, XmlElement>();

                foreach (var node in nodeTable)
                {
                    XmlElement element = xmlDoc.CreateElement(dataMap[node.NodeNameOffset]);

                    for (int i = 0,
                         j = node.AttributeCount;
                         i < j;
                         i++)
                    {
                        if (dataMap.ContainsKey(attributeTable[attributeIndex]
                                                .ValueOffset))
                        {
                            element.SetAttribute(dataMap[attributeTable[attributeIndex]
                                                         .NameOffset],
                                                 dataMap[attributeTable[attributeIndex]
                                                         .ValueOffset]);
                        }
                        else
                        {
                            throw new InvalidDataException("This is a bug according to the originl code.");
                            //element.SetAttribute(dataMap[attributeTable[attributeIndex].NameOffset], "BUGGED");
                        }

                        attributeIndex++;
                    }

                    xmlMap[node.NodeID] = element;

                    if (dataMap.ContainsKey(node.ContentOffset))
                    {
                        if (!string.IsNullOrWhiteSpace(dataMap[node.ContentOffset]))
                        {
                            element.AppendChild(xmlDoc.CreateCDataSection(dataMap[node.ContentOffset]));
                        }
                    }
                    else
                    {
                        throw new InvalidDataException("This is a bug according to the originl code.");
                        //element.AppendChild(xmlDoc.CreateCDataSection("BUGGED"));
                    }

                    if (xmlMap.ContainsKey(node.ParentNodeID))
                    {
                        xmlMap[node.ParentNodeID]
                        .AppendChild(element);
                    }
                    else
                    {
                        xmlDoc.AppendChild(element);
                    }
                }

                return(xmlDoc);
            }
        }
コード例 #18
0
   public static int ByteArrayToNumber(
 byte[] data,
 int index,
 int length,
 ByteOrderEnum byteOrder
 )
   {
       int value = 0;
         length = (int)Math.Min(length,data.Length-index);
         for(
       int i = index,
         endIndex = index+length;
       i < endIndex;
       i++
       )
         {value |= (data[i] & 0xff) << 8 * (byteOrder == ByteOrderEnum.LittleEndian ? i-index : endIndex-i-1);}
         return value;
   }
コード例 #19
0
        //public static ushort ReadUInt16(this BinaryReader br, ByteOrderEnum byteOrder = ByteOrderEnum.BigEndian)
        //{
        //  var bytes = new byte[] {
        //            br.ReadByte(),
        //            br.ReadByte(),
        //        };

        //  if (byteOrder == ByteOrderEnum.LittleEndian)
        //    bytes = bytes.Reverse().ToArray();

        //  return BitConverter.ToUInt16(bytes, 0);
        //}

        public static XmlDocument ReadFile(string file,
                                           ByteOrderEnum byteOrder = ByteOrderEnum.AutoDetect,
                                           bool writeLog           = false)
        {
            return(ReadStream(File.OpenRead(file), byteOrder, writeLog));
        }