/// <summary> /// Asserts that a subrecord's content is exactly a certain length /// </summary> /// <param name="frame">Frame to check</param> /// <param name="len">Length to assert on the content</param> /// <exception cref="System.ArgumentException">Thrown if frame's content length does not match parameter</exception> public static void AssertLength(this SubrecordFrame frame, int len) { if (frame.Content.Length != len) { throw new ArgumentException($"{frame.RecordType} Subrecord frame had unexpected length: {frame.Content.Length} != {len}"); } }
/// <summary> /// Iterates a MajorRecordFrame's subrecords and locates the first occurance of the desired type /// </summary> /// <param name="majorFrame">Frame to read from</param> /// <param name="type">Type to search for</param> /// <param name="frame">SubrecordFrame if found</param> /// <returns>True if matching subrecord is found</returns> public static bool TryLocateSubrecordFrame(this MajorRecordFrame majorFrame, RecordType type, out SubrecordFrame frame) { var find = PluginUtilityTranslation.FindFirstSubrecord(majorFrame.Content, majorFrame.Meta, type, navigateToContent: false); if (find == null) { frame = default; return(false); } frame = new SubrecordFrame(majorFrame.Meta, majorFrame.Content.Slice(find.Value)); return(true); }
/// <summary> /// Iterates a MajorRecordFrame's subrecords and locates the first occurance of the desired type /// </summary> /// <param name="majorFrame">Frame to read from</param> /// <param name="type">Type to search for</param> /// <param name="offset">Offset within the Major Record's contents to start searching</param> /// <param name="frame">SubrecordFrame if found</param> /// <param name="loc">Location of the subrecord, relative to the parent record's RecordType data</param> /// <returns>True if matching subrecord is found</returns> public static bool TryLocateSubrecordFrame(this MajorRecordFrame majorFrame, RecordType type, int offset, out SubrecordFrame frame, out int loc) { var find = PluginUtilityTranslation.FindFirstSubrecord(majorFrame.Content.Slice(offset - majorFrame.HeaderLength), majorFrame.Meta, type, navigateToContent: false); if (find == null) { frame = default; loc = default; return(false); } frame = new SubrecordFrame(majorFrame.Meta, majorFrame.Content.Slice(find.Value + offset - majorFrame.HeaderLength)); loc = find.Value + offset; return(true); }
/// <summary> /// Interprets a subrecord's content as a int. /// </summary> /// <param name="frame">Frame to read from</param> /// <exception cref="System.ArgumentException">Thrown if frame's content is not exactly 4</exception> /// <returns>Subrecord's content as a int</returns> public static int AsInt32(this SubrecordFrame frame) { frame.AssertLength(4); return(BinaryPrimitives.ReadInt32LittleEndian(frame.Content)); }
/// <summary> /// Interprets a subrecord's content as a short. /// </summary> /// <param name="frame">Frame to read from</param> /// <exception cref="System.ArgumentException">Thrown if frame's content is not exactly 2</exception> /// <returns>Subrecord's content as a short</returns> public static short AsInt16(this SubrecordFrame frame) { frame.AssertLength(2); return(BinaryPrimitives.ReadInt16LittleEndian(frame.Content)); }
/// <summary> /// Interprets a subrecord's content as a sbyte. /// </summary> /// <param name="frame">Frame to read from</param> /// <exception cref="System.ArgumentException">Thrown if frame's content is not exactly 1</exception> /// <returns>Subrecord's content as a sbyte</returns> public static sbyte AsInt8(this SubrecordFrame frame) { frame.AssertLength(1); return((sbyte)frame.Content[0]); }
/// <summary> /// Interprets a subrecord's content as a string. /// </summary> /// <param name="frame">Frame to read from</param> /// <returns>Subrecord's content as a string, null trimmed if applicable</returns> public static string AsString(this SubrecordFrame frame) { return(BinaryStringUtility.ProcessWholeToZString(frame.Content)); }
/// <summary> /// Interprets a subrecord's content as a double. /// </summary> /// <param name="frame">Frame to read from</param> /// <exception cref="System.ArgumentException">Thrown if frame's content is not exactly 8</exception> /// <returns>Subrecord's content as a double</returns> public static double AsDouble(this SubrecordFrame frame) { frame.AssertLength(8); return(frame.Content.Double()); }
/// <summary> /// Interprets a subrecord's content as a float. /// </summary> /// <param name="frame">Frame to read from</param> /// <exception cref="System.ArgumentException">Thrown if frame's content is not exactly 4</exception> /// <returns>Subrecord's content as a float</returns> public static float AsFloat(this SubrecordFrame frame) { frame.AssertLength(4); return(frame.Content.Float()); }
/// <summary> /// Interprets a subrecord's content as a long. /// </summary> /// <param name="frame">Frame to read from</param> /// <exception cref="System.ArgumentException">Thrown if frame's content is not exactly 8</exception> /// <returns>Subrecord's content as a long</returns> public static long AsInt64(this SubrecordFrame frame) { frame.AssertLength(8); return(BinaryPrimitives.ReadInt64LittleEndian(frame.Content)); }
/// <summary> /// Interprets a subrecord's content as a string. /// </summary> /// <param name="frame">Frame to read from</param> /// <param name="encoding">Encoding to use</param> /// <returns>Subrecord's content as a string, null trimmed if applicable</returns> public static string AsString(this SubrecordFrame frame, IMutagenEncoding encoding) { return(BinaryStringUtility.ProcessWholeToZString(frame.Content, encoding)); }