Esempio n. 1
0
 public FileNameBlock(BSAReader bsa, long position)
 {
     Names = new Lazy <ReadOnlyMemorySlice <byte>[]>(
         mode: System.Threading.LazyThreadSafetyMode.ExecutionAndPublication,
         valueFactory: () =>
     {
         using var stream                   = bsa.GetStream();
         stream.BaseStream.Position         = position;
         ReadOnlyMemorySlice <byte> data    = stream.ReadBytes(checked ((int)bsa._totalFileNameLength));
         ReadOnlyMemorySlice <byte>[] names = new ReadOnlyMemorySlice <byte> [bsa._fileCount];
         for (int i = 0; i < bsa._fileCount; i++)
         {
             var index = data.Span.IndexOf(default(byte));
             if (index == -1)
             {
                 throw new InvalidDataException("Did not end all of its strings in null bytes");
             }
             names[i] = data.Slice(0, index + 1);
             var str  = names[i].ReadStringTerm(bsa.HeaderType);
             data     = data.Slice(index + 1);
         }
         // Data doesn't seem to need to be fully consumed.
         // Official BSAs have overflow of zeros
         return(names);
     });
 }
Esempio n. 2
0
        public static BSAReader Load(AbsolutePath filename)
        {
            var bsa = new BSAReader {
                _streamFactory = new NativeFileStreamFactory(filename)
            };

            using var rdr = bsa.GetStream();
            bsa.LoadHeaders(rdr);
            return(bsa);
        }