/// <summary> /// Repacks all files into the pack. /// </summary> public override void Pack() { MemoryStream packStream = new MemoryStream(); BinaryWriter packWriter = new BinaryWriter(packStream); byte[] headerData = StreamHelper.ReadFile(this.GameFileName, this.HeaderSize); ushort fileCount = BitConverter.ToUInt16(headerData, 0x06); int fileTableOffset = BitConverter.ToInt32(headerData, 0x08); int[] folderSizes = this.GetFolderSizes(); string[] folderNames = this.GetFolderNames(); int folderIndex = 0; int folderFileIndex = 0; int pointerOffset = fileTableOffset; int fileOffset = 0; for (int i = 0; i < fileCount; i++) { while (folderFileIndex >= folderSizes[folderIndex]) { folderIndex++; folderFileIndex = 0; } FileType fileType = this.GetFileType(i); string childFileName = this.DetermineChildFileName(folderNames[folderIndex], fileType, folderFileIndex); byte[] childFileData = StreamHelper.ReadFile(ChildDirectoryPrefix + childFileName); StreamHelper.WriteBytes(fileOffset, headerData, pointerOffset); StreamHelper.WriteBytes(childFileData.Length, headerData, pointerOffset + 4); packWriter.Write(childFileData); int padLength = CalculatePaddingLength(childFileData.Length, 4); for (int p = 0; p < padLength; p++) { packWriter.Write(Padding); } fileOffset += childFileData.Length + padLength; pointerOffset += 8; folderFileIndex++; } packWriter.Flush(); MemoryStream contents = new MemoryStream(); contents.Write(headerData, 0, headerData.Length); packStream.WriteTo(contents); StreamHelper.WriteFile(this.GameFileName, contents.ToArray()); }
public virtual byte[] Serialize() { using (MemoryStream ms = new MemoryStream()) { using (BinaryWriter bw = new BinaryWriter(ms)) { bw.Write(StreamEntityCode.HikvHeader); StreamHelper.WriteBytes(bw, Buffer); return(ms.ToArray()); } } }
private static void WriteTriangles(Stream stream, IMesh mesh) { List <Triangle> triangles = mesh.GetTriangles().ToList(); byte[] numberOfTriangles = BitConverter.GetBytes(triangles.Count); StreamHelper.WriteBytes(stream, numberOfTriangles); foreach (Triangle triangle in triangles) { Vector normal = FindNormal(triangle.V1, triangle.V2, triangle.V3); WriteTriangle(stream, triangle, normal); } }
private static void WriteTriangle(Stream stream, Triangle triangle, Vector normal) { StreamHelper.WriteBytes(stream, BitConverter.GetBytes(normal.I)); StreamHelper.WriteBytes(stream, BitConverter.GetBytes(normal.J)); StreamHelper.WriteBytes(stream, BitConverter.GetBytes(normal.K)); StreamHelper.WriteBytes(stream, BitConverter.GetBytes(triangle.V1.X)); StreamHelper.WriteBytes(stream, BitConverter.GetBytes(triangle.V1.Y)); StreamHelper.WriteBytes(stream, BitConverter.GetBytes(triangle.V1.Z)); StreamHelper.WriteBytes(stream, BitConverter.GetBytes(triangle.V2.X)); StreamHelper.WriteBytes(stream, BitConverter.GetBytes(triangle.V2.Y)); StreamHelper.WriteBytes(stream, BitConverter.GetBytes(triangle.V2.Z)); StreamHelper.WriteBytes(stream, BitConverter.GetBytes(triangle.V3.X)); StreamHelper.WriteBytes(stream, BitConverter.GetBytes(triangle.V3.Y)); StreamHelper.WriteBytes(stream, BitConverter.GetBytes(triangle.V3.Z)); byte[] attributeByteCount = new byte[2]; StreamHelper.WriteBytes(stream, attributeByteCount); }
/// <summary> /// Inserts the text strings back into the game file. /// </summary> /// <returns>A value indicating whether the file was successfully saved.</returns> protected override bool SaveText() { byte[] headerData = StreamHelper.ReadFile(this.GameFileName, this.TextSectionOffset); MemoryStream textStream = new MemoryStream(); BinaryWriter textWriter = new BinaryWriter(textStream); // Placeholder for text length textWriter.Write((ushort)0x0000); byte[] encodedString; int pointerOffset = 0x0C; int textOffset = 0x02; for (int i = 0; i < this.strings.Length; i++) { encodedString = this.Game.GetBytes(this.strings[i]); ushort stringLength = (ushort)encodedString.Length; StreamHelper.WriteBytes(textOffset, headerData, pointerOffset); textWriter.Write(stringLength); textWriter.Write(encodedString); pointerOffset += TableEntryLength; textOffset += 0x02 + stringLength; } textWriter.Flush(); byte[] textData = textStream.ToArray(); ushort textLength = (ushort)textData.Length; ushort totalLength = (ushort)(this.TextSectionOffset + textLength); WriteBytes(textLength, textData, 0x00); WriteBytes(totalLength, headerData, 0x00); MemoryStream contents = new MemoryStream(); contents.Write(headerData, 0, headerData.Length); contents.Write(textData, 0, textData.Length); StreamHelper.WriteFile(this.GameFileName, contents.ToArray()); return(true); }
public static Image GetQRCode(byte[] data, ErrorCorrectionLevel level = ErrorCorrectionLevel.M) { bool requires16BitLength = false; int maxBytesInVersion9Code = QRErrorCorrections.GetQRVersionInfo(9).GetCorrectionInfo(level).TotalDataBytes; if (maxBytesInVersion9Code - 2 < data.Length) { // This data requires a version 10 or higher code; will not fit in version 9 or lower. // Version 10 and higher codes require 16-bit data lengths. requires16BitLength = true; } StreamHelper sh = new StreamHelper(); sh.WriteNibble(0x04); // byte mode if (requires16BitLength) { sh.WriteWord((ushort)data.Length); } else { sh.WriteByte((byte)data.Length); } sh.WriteBytes(new ArraySegment <byte>(data)); sh.WriteNibble(0x00); // terminator byte[] binaryData = sh.ToArray(); int qrCodeVersion; ErrorCorrectionLevel errorCorrectionLevel; byte[] finalMessageSequence = QRErrorCorrections.GetMessageSequence(binaryData, level, out qrCodeVersion, out errorCorrectionLevel); SymbolTemplate template = SymbolTemplate.CreateTemplate(qrCodeVersion); template.ErrorCorrectionLevel = errorCorrectionLevel; template.PopulateData(finalMessageSequence); template.Complete(); return(template.ToImage()); }
public static Image GetQRCode(byte[] data, ErrorCorrectionLevel level = ErrorCorrectionLevel.M) { bool requires16BitLength = false; int maxBytesInVersion9Code = QRErrorCorrections.GetQRVersionInfo(9).GetCorrectionInfo(level).TotalDataBytes; if (maxBytesInVersion9Code - 2 < data.Length) { // This data requires a version 10 or higher code; will not fit in version 9 or lower. // Version 10 and higher codes require 16-bit data lengths. requires16BitLength = true; } StreamHelper sh = new StreamHelper(); sh.WriteNibble(0x04); // byte mode if (requires16BitLength) { sh.WriteWord((ushort)data.Length); } else { sh.WriteByte((byte)data.Length); } sh.WriteBytes(new ArraySegment<byte>(data)); sh.WriteNibble(0x00); // terminator byte[] binaryData = sh.ToArray(); int qrCodeVersion; ErrorCorrectionLevel errorCorrectionLevel; byte[] finalMessageSequence = QRErrorCorrections.GetMessageSequence(binaryData, level, out qrCodeVersion, out errorCorrectionLevel); SymbolTemplate template = SymbolTemplate.CreateTemplate(qrCodeVersion); template.ErrorCorrectionLevel = errorCorrectionLevel; template.PopulateData(finalMessageSequence); template.Complete(); return template.ToImage(); }
/// <summary> /// Inserts the text strings back into the game file. /// </summary> /// <returns>A value indicating whether the file was successfully saved.</returns> protected override bool SaveText() { this.tableOffsets[0] = this.headerData.Length; MemoryStream textStream = new MemoryStream(); BinaryWriter textWriter = new BinaryWriter(textStream); int tableIndex = 0x06; for (int i = 0; i < this.strings.Length; i++) { // Skip the one string that's empty and contains no terminator. if (i != this.skipIndex) { try { byte[] encodedBytes = this.encoding.GetBytes(this.strings[i]); ushort length = (ushort)encodedBytes.Length; byte[] lengthBytes = BitConverter.GetBytes(length); Array.Copy(lengthBytes, 0, this.tableData[0], tableIndex, 2); textWriter.Write(encodedBytes); } catch (InvalidDataException exc) { throw new InvalidDataException(String.Format("Unable to encode line {0} [{1}]: {2}", i, this.strings[i], exc.Message)); } } tableIndex += 0x08; } // Pad the text block with 00 until its size is a multiple of 16 bytes. textWriter.Flush(); int padding = (int)((0x10 - (textStream.Length % 0x10)) % 0x10); for (int i = 0; i < padding; i++) { textWriter.Write((byte)0x00); } textWriter.Flush(); this.textData[0] = textStream.ToArray(); int headerIndex = 0x14; for (int i = 0; i < this.tableData.Length; i++) { this.tableOffsets[i] = (i == 0) ? this.headerData.Length : this.textOffsets[i - 1] + this.textData[i - 1].Length; this.textOffsets[i] = this.tableOffsets[i] + this.tableData[i].Length; this.blockLengths[i] = this.tableData[i].Length + this.textData[i].Length; StreamHelper.WriteBytes(this.tableOffsets[i], this.headerData, headerIndex); StreamHelper.WriteBytes(this.textOffsets[i], this.headerData, headerIndex + 0x04); StreamHelper.WriteBytes(this.blockLengths[i], this.headerData, headerIndex + 0x08); headerIndex += 0x10; } MemoryStream contents = new MemoryStream(); contents.Write(this.headerData, 0, this.headerData.Length); for (int i = 0; i < this.tableData.Length; i++) { contents.Write(this.tableData[i], 0, this.tableData[i].Length); contents.Write(this.textData[i], 0, this.textData[i].Length); } StreamHelper.WriteFile(this.GameFileName, contents.ToArray()); return(true); }
public void Serialize(StreamHelper streamHelper) { //streamHelper.SeekTo(0x138); //if (!streamHelper.ReadAscii(4).Equals("mapv")) //{ // throw new Exception("expected mapv magic."); //} streamHelper.WriteInt32(_blf); streamHelper.WriteBytes(blfUnknown); streamHelper.WriteInt32(chdr); streamHelper.WriteBytes(chdrHeaderUnknown1); streamHelper.WriteUTF16(chdrHeaderName, 0x20); streamHelper.WriteAscii(chdrHeaderDescription, 0x80); streamHelper.WriteAscii(chdrHeaderAuthor, 0x10); streamHelper.WriteInt64(chdrHeaderSize); streamHelper.WriteInt64(chdrHeaderCreationDate); streamHelper.WriteInt64(chdrHeaderUnknown2); streamHelper.WriteInt32(chdrHeaderUnknown3); streamHelper.WriteInt32(chdrHeaderUnknown4); streamHelper.WriteInt32(chdrHeaderUnknown5); streamHelper.WriteInt32(chdrHeaderUnknown6); streamHelper.WriteInt32(chdrHeaderMapID); streamHelper.WriteInt32(chdrHeaderUnknown7); streamHelper.WriteInt32(chdrHeaderUnknown8); streamHelper.WriteBytes(chdrHeaderUnknown9); streamHelper.WriteInt32(mapv); streamHelper.WriteBytes(mapvHeaderUnknown1); streamHelper.WriteUTF16(mapvHeaderName, 0x20); streamHelper.WriteAscii(mapvHeaderDescription, 0x80); streamHelper.WriteAscii(mapvHeaderAuthor, 0x10); streamHelper.WriteInt64(mapvHeaderSize); streamHelper.WriteInt64(mapvHeaderCreationDate); streamHelper.WriteInt64(mapvHeaderUnknown2); streamHelper.WriteInt32(mapvHeaderUnknown3); streamHelper.WriteInt32(mapvHeaderUnknown4); streamHelper.WriteInt32(mapvHeaderUnknown5); streamHelper.WriteInt32(mapvHeaderUnknown6); streamHelper.WriteInt32(mapvHeaderMapID); streamHelper.WriteInt32(mapvHeaderUnknown7); streamHelper.WriteInt32(mapvHeaderUnknown8); streamHelper.WriteBytes(mapvHeaderUnknown9); streamHelper.WriteInt16(scnrObjectsCount); streamHelper.WriteInt16(totalObjectsCount); streamHelper.WriteInt16(budgetEntriesCount); streamHelper.WriteInt16(sandboxPlacementsCount); streamHelper.WriteInt32(mapID); streamHelper.WriteVector2(worldBoundsX); streamHelper.WriteVector2(worldBoundsY); streamHelper.WriteVector2(worldBoundsZ); streamHelper.WriteInt32(unknown1); streamHelper.WriteFloat(maxBudget); streamHelper.WriteFloat(currentBudget); streamHelper.WriteInt32(unknown2); streamHelper.WriteInt32(unknown3); foreach (SandboxPlacement placement in sandboxPlacements) { placement.Serialize(streamHelper); } streamHelper.WriteBytes(unknown4); foreach (BudgetEntry entry in budgetEntries) { entry.Serialize(streamHelper); } streamHelper.WriteBytes(unknownPad); streamHelper.WriteInt32(_eof); streamHelper.WriteBytes(unknown5); streamHelper.WriteBytes(emptyPad); }