113 lines
4.1 KiB
C#
113 lines
4.1 KiB
C#
|
using System;
|
||
|
|
||
|
namespace TomShane.Neoforce.External.Zip
|
||
|
{
|
||
|
|
||
|
internal class Shared
|
||
|
{
|
||
|
protected internal static string StringFromBuffer(byte[] buf, int start, int maxlength)
|
||
|
{
|
||
|
int i;
|
||
|
char[] c = new char[maxlength];
|
||
|
for (i = 0; (i < maxlength) && (i < buf.Length) && (buf[i] != 0); i++)
|
||
|
{
|
||
|
c[i] = (char)buf[i]; // System.BitConverter.ToChar(buf, start+i*2);
|
||
|
}
|
||
|
string s = new System.String(c, 0, i);
|
||
|
return s;
|
||
|
}
|
||
|
|
||
|
protected internal static int ReadSignature(System.IO.Stream s)
|
||
|
{
|
||
|
int n = 0;
|
||
|
byte[] sig = new byte[4];
|
||
|
n = s.Read(sig, 0, sig.Length);
|
||
|
if (n != sig.Length) throw new Exception("Could not read signature - no data!");
|
||
|
int signature = (((sig[3] * 256 + sig[2]) * 256) + sig[1]) * 256 + sig[0];
|
||
|
return signature;
|
||
|
}
|
||
|
|
||
|
protected internal static long FindSignature(System.IO.Stream s, int SignatureToFind)
|
||
|
{
|
||
|
long startingPosition = s.Position;
|
||
|
|
||
|
int BATCH_SIZE = 1024;
|
||
|
byte[] targetBytes = new byte[4];
|
||
|
targetBytes[0] = (byte) (SignatureToFind >> 24);
|
||
|
targetBytes[1] = (byte) ((SignatureToFind & 0x00FF0000) >> 16);
|
||
|
targetBytes[2] = (byte) ((SignatureToFind & 0x0000FF00) >> 8);
|
||
|
targetBytes[3] = (byte) (SignatureToFind & 0x000000FF);
|
||
|
byte[] batch = new byte[BATCH_SIZE];
|
||
|
int n = 0;
|
||
|
bool success = false;
|
||
|
do
|
||
|
{
|
||
|
n = s.Read(batch, 0, batch.Length);
|
||
|
if (n != 0)
|
||
|
{
|
||
|
for (int i = 0; i < n; i++)
|
||
|
{
|
||
|
if (batch[i] == targetBytes[3])
|
||
|
{
|
||
|
s.Seek(i - n, System.IO.SeekOrigin.Current);
|
||
|
int sig = ReadSignature(s);
|
||
|
success = (sig == SignatureToFind);
|
||
|
if (!success) s.Seek(-3, System.IO.SeekOrigin.Current);
|
||
|
break; // out of for loop
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
else break;
|
||
|
if (success) break;
|
||
|
} while (true);
|
||
|
if (!success)
|
||
|
{
|
||
|
s.Seek(startingPosition, System.IO.SeekOrigin.Begin);
|
||
|
return -1; // or throw?
|
||
|
}
|
||
|
|
||
|
// subtract 4 for the signature.
|
||
|
long bytesRead = (s.Position - startingPosition) - 4 ;
|
||
|
// number of bytes read, should be the same as compressed size of file
|
||
|
return bytesRead;
|
||
|
}
|
||
|
protected internal static DateTime PackedToDateTime(Int32 packedDateTime)
|
||
|
{
|
||
|
Int16 packedTime = (Int16)(packedDateTime & 0x0000ffff);
|
||
|
Int16 packedDate = (Int16)((packedDateTime & 0xffff0000) >> 16);
|
||
|
|
||
|
int year = 1980 + ((packedDate & 0xFE00) >> 9);
|
||
|
int month = (packedDate & 0x01E0) >> 5;
|
||
|
int day = packedDate & 0x001F;
|
||
|
|
||
|
|
||
|
int hour = (packedTime & 0xF800) >> 11;
|
||
|
int minute = (packedTime & 0x07E0) >> 5;
|
||
|
int second = packedTime & 0x001F;
|
||
|
|
||
|
DateTime d = System.DateTime.Now;
|
||
|
try { d = new System.DateTime(year, month, day, hour, minute, second, 0); }
|
||
|
catch
|
||
|
{
|
||
|
Console.Write("\nInvalid date/time?:\nyear: {0} ", year);
|
||
|
Console.Write("month: {0} ", month);
|
||
|
Console.WriteLine("day: {0} ", day);
|
||
|
Console.WriteLine("HH:MM:SS= {0}:{1}:{2}", hour, minute, second);
|
||
|
}
|
||
|
|
||
|
return d;
|
||
|
}
|
||
|
|
||
|
|
||
|
protected internal static Int32 DateTimeToPacked(DateTime time)
|
||
|
{
|
||
|
UInt16 packedDate = (UInt16)((time.Day & 0x0000001F) | ((time.Month << 5) & 0x000001E0) | (((time.Year - 1980) << 9) & 0x0000FE00));
|
||
|
UInt16 packedTime = (UInt16)((time.Second & 0x0000001F) | ((time.Minute << 5) & 0x000007E0) | ((time.Hour << 11) & 0x0000F800));
|
||
|
return (Int32)(((UInt32)(packedDate << 16)) | packedTime);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
|
||
|
|
||
|
}
|