示例#1
0
文件: PSF.cs 项目: CadeLaRen/BizHawk
		public bool Load(string fpPSF, Func<Stream,int,byte[]> cbDeflater)
		{
			using(var fs = File.OpenRead(fpPSF))
			{
				//not endian safe
				var br = new BinaryReader(fs);
				var sig = br.ReadStringFixedAscii(4);
				if (sig != "PSF\x1")
					return false;

				int reserved_size = br.ReadInt32();
				int compressed_size = br.ReadInt32();
				int compressed_crc32 = br.ReadInt32();
				
				//load tags
				//tags run until the end of the file
				fs.Position = 16 + reserved_size + compressed_size;
				if (fs.Position + 5 > fs.Length)
				{
					//theres no space for tags, probably just no tags in the file
				}
				else
				{
					if (br.ReadStringFixedAscii(5) == "[TAG]")
					{
						var tagstring = br.ReadStringFixedAscii((int)(fs.Length - fs.Position)).Replace("\r\n", "\n");
						foreach (var tag in tagstring.Split('\n', '\x0'))
						{
							if (tag.Trim() == "")
								continue;
							int eq = tag.IndexOf('=');
							if (eq != -1)
								TagsDictionary[tag.Substring(0, eq)] = tag.Substring(eq + 1);
							else
								LooseTags.Add(tag);
						}
					}
				}

				//load compressed section buffer
				fs.Position = 16 + reserved_size;
				Data = cbDeflater(fs, compressed_size);

				//load lib if needed
				if (TagsDictionary.ContainsKey("_lib"))
				{
					var fpLib = Path.Combine(Path.GetDirectoryName(fpPSF), TagsDictionary["_lib"]);
					if (!File.Exists(fpLib))
						return false;
					PSF lib = new PSF();
					if (!lib.Load(fpLib,cbDeflater))
						return false;
					LibData = lib.Data;
				}
			}

			return true;
		}
示例#2
0
        public bool Load(string fpPSF, Func <Stream, int, byte[]> cbDeflater)
        {
            using (var fs = File.OpenRead(fpPSF))
            {
                //not endian safe
                var br  = new BinaryReader(fs);
                var sig = br.ReadStringFixedAscii(4);
                if (sig != "PSF\x1")
                {
                    return(false);
                }

                int reserved_size    = br.ReadInt32();
                int compressed_size  = br.ReadInt32();
                int compressed_crc32 = br.ReadInt32();

                //load tags
                //tags run until the end of the file
                fs.Position = 16 + reserved_size + compressed_size;
                if (fs.Position + 5 > fs.Length)
                {
                    //theres no space for tags, probably just no tags in the file
                }
                else
                {
                    if (br.ReadStringFixedAscii(5) == "[TAG]")
                    {
                        var tagstring = br.ReadStringFixedAscii((int)(fs.Length - fs.Position)).Replace("\r\n", "\n");
                        foreach (var tag in tagstring.Split('\n', '\x0'))
                        {
                            if (tag.Trim() == "")
                            {
                                continue;
                            }
                            int eq = tag.IndexOf('=');
                            if (eq != -1)
                            {
                                TagsDictionary[tag.Substring(0, eq)] = tag.Substring(eq + 1);
                            }
                            else
                            {
                                LooseTags.Add(tag);
                            }
                        }
                    }
                }

                //load compressed section buffer
                fs.Position = 16 + reserved_size;
                Data        = cbDeflater(fs, compressed_size);

                //load lib if needed
                if (TagsDictionary.ContainsKey("_lib"))
                {
                    var fpLib = Path.Combine(Path.GetDirectoryName(fpPSF), TagsDictionary["_lib"]);
                    if (!File.Exists(fpLib))
                    {
                        return(false);
                    }
                    PSF lib = new PSF();
                    if (!lib.Load(fpLib, cbDeflater))
                    {
                        return(false);
                    }
                    LibData = lib.Data;
                }
            }

            return(true);
        }