protected internal virtual LhaEntry ReadHeader_Lv1(byte[] @base) { LhaEntry e = new LhaEntry(); flagSum = true; srcSum = @base[HDR1_OFF_SUM]; if (srcSum < 0) { srcSum += 256; } e.SetMethod(encoding.GetString(@base, HDR1_OFF_METHOD, 5)); e.SetOriginalSize(Get32(@base, HDR1_OFF_ORIGSIZE)); e.SetDosTimeStamp(Get32(@base, HDR1_OFF_TIMESTAMP)); if (@base[HDR1_OFF_19] != 0x20) { throw (new LhaException("Lha header is broken (offset 19 is not 0x20)")); } calcSum.Update(@base, 2, @base.Length - 2); calcCRC.Update(@base, 0, @base.Length); byte[] buf = new byte[1]; if (binaryReader.Read(buf, 0, buf.Length) != buf.Length) { throw (new LhaException("Lha header is broken (cannot read name size)")); } int nameSize = buf[0]; calcSum.Update(buf, 0, buf.Length); calcCRC.Update(buf, 0, buf.Length); string name = ""; if (nameSize > 0) { buf = new byte[nameSize]; if (binaryReader.Read(buf, 0, buf.Length) != buf.Length) { throw (new LhaException("Lha header is broken (cannot read name)")); } name = encoding.GetString(buf); calcSum.Update(buf, 0, buf.Length); calcCRC.Update(buf, 0, buf.Length); } buf = new byte[2]; if (binaryReader.Read(buf, 0, buf.Length) != buf.Length) { throw (new LhaException("Lha header is broken (cannot read crc value)")); } e.SetCRC(Get16(buf, 0)); calcSum.Update(buf, 0, buf.Length); calcCRC.Update(buf, 0, buf.Length); buf = new byte[1]; if (binaryReader.Read(buf, 0, buf.Length) != buf.Length) { throw (new LhaException("Lha header is broken (cannot read os signature)")); } e.SetOS(buf[0]); calcSum.Update(buf, 0, buf.Length); calcCRC.Update(buf, 0, buf.Length); long extSize = 0; buf = new byte[2]; if (binaryReader.Read(buf, 0, buf.Length) != buf.Length) { throw (new LhaException("Lha header is broken (cannot read ext)")); } calcSum.Update(buf, 0, buf.Length); calcCRC.Update(buf, 0, buf.Length); for (int next = Get16(buf, 0); next > 0; next = ReadExHeader(e, next)) { extSize += next; } e.SetCompressedSize(Get32(@base, HDR0_OFF_COMPSIZE) - extSize); if (fileName.Length > 0) { name = dirName + fileName; } else { name = ConvertFilePath(name, e.GetOS()); } e.SetPath(name); return(e); }
protected internal virtual LhaEntry ReadHeader_Lv0(byte[] @base) { LhaEntry e = new LhaEntry(); flagSum = true; int headerSize = @base[HDRU_OFF_HEADERSIZE]; srcSum = @base[HDR0_OFF_SUM]; if (srcSum < 0) { srcSum += 256; } e.SetMethod(encoding.GetString(@base, HDR0_OFF_METHOD, 5)); e.SetCompressedSize(Get32(@base, HDR0_OFF_COMPSIZE)); e.SetOriginalSize(Get32(@base, HDR0_OFF_ORIGSIZE)); e.SetDosTimeStamp(Get32(@base, HDR0_OFF_TIMESTAMP)); calcSum.Update(@base, 2, @base.Length - 2); byte[] buf = new byte[1]; if (binaryReader.Read(buf, 0, buf.Length) != buf.Length) { throw (new LhaException("Lha header is broken (header size does'nt match)")); } int nameSize = buf[0]; calcSum.Update(buf, 0, buf.Length); buf = new byte[nameSize]; if (binaryReader.Read(buf, 0, buf.Length) != buf.Length) { throw (new LhaException("Lha header is broken (cannot read name)")); } string name = encoding.GetString(buf); calcSum.Update(buf, 0, buf.Length); int diff = headerSize - nameSize; if ((diff != 20) && (diff != 22) && (diff < 23)) { throw (new LhaException("Lha header is broken (header size does'nt match)")); } e.SetOS(LhaEntry.OSID_SIG_GENERIC); if (diff >= 22) { buf = new byte[2]; if (binaryReader.Read(buf, 0, buf.Length) != buf.Length) { throw (new LhaException("Lha header is broken (cannot read crc value)")); } e.SetCRC(Get16(buf, 0)); calcSum.Update(buf, 0, buf.Length); } if (diff >= 23) { buf = new byte[1]; if (binaryReader.Read(buf, 0, buf.Length) != buf.Length) { throw (new LhaException("Lha header is broken (cannot read os signature)")); } e.SetOS(buf[0]); calcSum.Update(buf, 0, buf.Length); } if (diff > 23) { buf = new byte[diff - 24]; if (binaryReader.Read(buf, 0, buf.Length) != buf.Length) { throw (new LhaException("Lha header is broken (cannot read ext)")); } calcSum.Update(buf, 0, buf.Length); } e.SetPath(ConvertFilePath(name, e.GetOS())); return(e); }