protected override HeaderDetails ReadHeader()

in src/managed/DiffGen/archives/CpioArchives/BinaryCpioArchive.cs [32:88]


        protected override HeaderDetails ReadHeader(BinaryReader reader)
        {
            byte[] rawData = new byte[CpioBinaryHeaderSize];
            if (reader.Read(rawData, 0, CpioBinaryHeaderSize) != CpioBinaryHeaderSize)
            {
                throw new FormatException("Not enough data present to store a CPIO binary header");
            }

            var magic = (uint)rawData[0] + (0x100u * (uint)rawData[1]);

            if (magic != BinaryMagic)
            {
                throw new FormatException("Magic constant not detected.");
            }

            var dev = rawData[2] + (0x100u * rawData[3]);
            var ino = rawData[4] + (0x100u * rawData[5]);
            var mode = rawData[6] + (0x100u * rawData[7]);
            var uid = rawData[8] + (0x100u * rawData[9]);
            var gid = rawData[10] + (0x100u * rawData[11]);
            var nlink = rawData[12] + (0x100u * rawData[13]);
            var rdev = rawData[14] + (0x100u * rawData[15]);
            var mtime = rawData[18] + (0x100u * rawData[19]) + (0x10000u * rawData[16]) + (0x1000000u * rawData[17]);
            var namesize = rawData[20] + (0x100u * rawData[21]);
            var filesize = rawData[24] + (0x100u * rawData[25]) + (0x10000u * rawData[22]) + (0x1000000u * rawData[23]);

            // CPIO appends an extra NUL character if the namesize is odd
            int rawNameSize = (int)namesize;
            if ((rawNameSize & 1) == 1)
            {
                rawNameSize++;
            }

            byte[] rawName = new byte[rawNameSize];
            if (rawNameSize != reader.Read(rawName, 0, rawNameSize))
            {
                throw new FormatException("Not enough data for the name for CPIO binary header");
            }

            var name = AsciiData.FromNulPaddedString(rawName, 0, rawNameSize);

            List<byte> allData = new List<byte>();
            allData.AddRange(rawData);
            allData.AddRange(rawName);

            int allDataSize = allData.Count;

            var chunkName = ChunkNames.MakeHeaderChunkName(name);
            var headerItem = ItemDefinition.FromByteSpan(allData.ToArray()).WithName(chunkName);

            if ((name.CompareTo(TrailerFileName) == 0) && (filesize == 0) && (uid == 0))
            {
                TrailerDetected = true;
            }

            return new HeaderDetails(headerItem, null, name, filesize);
        }