public string szSaveName; // Unicode save name( RM_MAXLENGTH chars ) #endregion Fields #region Methods public static TRichGameHeader Create( byte[] xgpBytes ) { Debug.Assert( xgpBytes != null ); TRichGameHeader header = new TRichGameHeader(); header.dwMagicNumber = BitConverter.ToUInt32( xgpBytes, 0 ); if( header.dwMagicNumber != Const.RM_MAGICNUMBER ) { // TODO: RGMH不一致 } header.dwHeaderVersion = BitConverter.ToUInt32( xgpBytes, 4 ); header.dwHeaderSize = BitConverter.ToUInt32( xgpBytes, 8 ); header.liThumnailOffset = BitConverter.ToInt64( xgpBytes, 12 ); header.dwThumbnailSize = BitConverter.ToUInt32( xgpBytes, 20 ); header.guidGameId = new TGUID(); header.guidGameId.D1 = BitConverter.ToUInt32( xgpBytes, 24 ); header.guidGameId.D2 = BitConverter.ToUInt16( xgpBytes, 28 ); header.guidGameId.D3 = BitConverter.ToUInt16( xgpBytes, 30 ); header.guidGameId.D4 = xgpBytes.Skip( 32 ).Take( 8 ).ToArray(); header.szGameName = Utility.GetEncodeString( Encoding.Unicode, xgpBytes, 40, Const.RM_MAXLENGTH ); header.szSaveName = Utility.GetEncodeString( Encoding.Unicode, xgpBytes, 40 + Const.RM_MAXLENGTH * 2, Const.RM_MAXLENGTH ); header.szLevelName = Utility.GetEncodeString( Encoding.Unicode, xgpBytes, 40 + Const.RM_MAXLENGTH * 4, Const.RM_MAXLENGTH ); header.szComments = Utility.GetEncodeString( Encoding.Unicode, xgpBytes, 40 + Const.RM_MAXLENGTH * 6, Const.RM_MAXLENGTH ); return header; }
private static void SaveThumnailJpeg( byte[] xgpBytes, TRichGameHeader header ) { byte[] thumnail = xgpBytes.Skip( (int)header.dwHeaderSize ).Take( (int)header.dwThumbnailSize ).ToArray(); File.WriteAllBytes( "thumnail.jpg", thumnail ); }