public BinaryDataBuffer(byte[] buffer, ByteOrderEnum byteOrder = ByteOrderEnum.LittleEndian) { _buffer = buffer; ByteOrder = byteOrder; Converter = new EndianBitConverter(); Converter.IsLittleEndian = byteOrder == ByteOrderEnum.LittleEndian; }
public static XmlDocument ReadBytes(byte[] inBytes, ByteOrderEnum byteOrder = ByteOrderEnum.AutoDetect, Boolean writeLog = false) { Stream ms = new MemoryStream(inBytes); return(CryXmlSerializer.ReadStream(ms, byteOrder, writeLog)); }
public static int ByteArrayToInt( byte[] data, int index, ByteOrderEnum byteOrder ) { return(ByteArrayToNumber(data, index, 4, byteOrder)); }
public static int ByteArrayToInt( byte[] data, int index, ByteOrderEnum byteOrder ) { return ByteArrayToNumber(data,index,4,byteOrder); }
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); }
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); }
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)); }
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)); }
//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)); }
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)); }
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); } }
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); } }
public static XmlDocument ReadFile(String inFile, ByteOrderEnum byteOrder = ByteOrderEnum.AutoDetect, Boolean writeLog = false) { return(CryXmlSerializer.ReadStream(File.OpenRead(inFile), byteOrder, writeLog)); }
public БуферДвоичныхДанных(byte[] buffer, ByteOrderEnum byteOrder = ByteOrderEnum.LittleEndian) { _buffer = buffer; ByteOrder = byteOrder; }
public BinaryDataBuffer(byte[] buffer, ByteOrderEnum byteOrder = ByteOrderEnum.LittleEndian) { _buffer = buffer; ByteOrder = byteOrder; }
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; }
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); } }
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; }
//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)); }