282 lines
7.7 KiB
C#
282 lines
7.7 KiB
C#
using System;
|
|
using System.Collections.Generic;
|
|
using System.Drawing;
|
|
using System.Drawing.Imaging;
|
|
using System.IO;
|
|
using System.Linq;
|
|
using System.Security.Cryptography;
|
|
using System.Text;
|
|
using System.Threading.Tasks;
|
|
|
|
namespace General
|
|
{
|
|
class Tools
|
|
{
|
|
|
|
public static void WriteStringToStream(Stream s, String str)
|
|
{
|
|
Byte[] bytes = Encoding.UTF8.GetBytes(str);
|
|
s.Write(bytes, 0x00, bytes.Length);
|
|
}
|
|
public static MemoryStream ByteToStream(byte[] Array)
|
|
{
|
|
MemoryStream ms = new MemoryStream();
|
|
ms.Write(Array, 0x00, Array.Length);
|
|
ms.Seek(0, SeekOrigin.Begin);
|
|
return ms;
|
|
}
|
|
|
|
public static byte[] StreamToByte(Stream stream)
|
|
{
|
|
int StreamLen = (int)stream.Length;
|
|
byte[] Bytes = new byte[StreamLen];
|
|
stream.Seek(0, SeekOrigin.Begin);
|
|
stream.Read(Bytes, 0x00, StreamLen);
|
|
return Bytes;
|
|
}
|
|
|
|
public static string GetFileExtension(byte[] Bytes)
|
|
{
|
|
if (IsImage(Bytes))
|
|
{
|
|
using (Bitmap bmp = GetBitmap(Bytes))
|
|
{
|
|
if (bmp.RawFormat.Equals(ImageFormat.Jpeg))
|
|
return ".jpeg";
|
|
else if (bmp.RawFormat.Equals(ImageFormat.Bmp))
|
|
return ".bmp";
|
|
else if (bmp.RawFormat.Equals(ImageFormat.Gif))
|
|
return ".gif";
|
|
else if (bmp.RawFormat.Equals(ImageFormat.Png))
|
|
return ".png";
|
|
else if (bmp.RawFormat.Equals(ImageFormat.Tiff))
|
|
return ".tiff";
|
|
else if (bmp.RawFormat.Equals(ImageFormat.Icon))
|
|
return ".ico";
|
|
else if (bmp.RawFormat.Equals(ImageFormat.Exif))
|
|
return ".exif";
|
|
else if (bmp.RawFormat.Equals(ImageFormat.Emf))
|
|
return ".emf";
|
|
else if (bmp.RawFormat.Equals(ImageFormat.Wmf))
|
|
return ".wmf";
|
|
else
|
|
return ".raw";
|
|
}
|
|
}
|
|
else if (IsZlib(Bytes))
|
|
{
|
|
return ".z";
|
|
}
|
|
else if (IsRcf(Bytes))
|
|
{
|
|
return ".rcs";
|
|
}
|
|
else if (IsDDS(Bytes))
|
|
{
|
|
return ".dds";
|
|
}
|
|
else if (IsVAG(Bytes))
|
|
{
|
|
return ".vag";
|
|
}
|
|
else if (IsGim(Bytes))
|
|
{
|
|
return ".gim";
|
|
}
|
|
else if(!HasBinaryContent(Encoding.UTF8.GetString(Bytes)))
|
|
{
|
|
return ".txt";
|
|
}
|
|
else
|
|
{
|
|
return ".bin";
|
|
}
|
|
}
|
|
|
|
public static bool IsVAG(byte[] Bytes)
|
|
{
|
|
MemoryStream Data = ByteToStream(Bytes);
|
|
String header = ReadString(Data, 4);
|
|
if (header.StartsWith("VAG"))
|
|
{
|
|
return true;
|
|
}
|
|
else
|
|
{
|
|
return false;
|
|
}
|
|
}
|
|
|
|
public static bool IsDDS(byte[] Bytes)
|
|
{
|
|
MemoryStream Data = ByteToStream(Bytes);
|
|
String header = ReadString(Data, 4);
|
|
if (header.StartsWith("DDS"))
|
|
{
|
|
return true;
|
|
}
|
|
else
|
|
{
|
|
return false;
|
|
}
|
|
}
|
|
|
|
|
|
public static bool IsRcf(byte[] Bytes)
|
|
{
|
|
MemoryStream Data = ByteToStream(Bytes);
|
|
String header = ReadString(Data, 5);
|
|
if (header.StartsWith("RCSF"))
|
|
{
|
|
return true;
|
|
}
|
|
else
|
|
{
|
|
return false;
|
|
}
|
|
}
|
|
|
|
public static bool IsGim(byte[] Bytes)
|
|
{
|
|
MemoryStream Data = ByteToStream(Bytes);
|
|
String header = ReadString(Data, 4);
|
|
if (header.StartsWith("MIG"))
|
|
{
|
|
return true;
|
|
}
|
|
else
|
|
{
|
|
return false;
|
|
}
|
|
}
|
|
|
|
public static bool IsZlib(byte[] Bytes)
|
|
{
|
|
if (Bytes[0] == 0x78)
|
|
{
|
|
if (Bytes[1] == 0x01)
|
|
return true;
|
|
if (Bytes[1] == 0x9C)
|
|
return true;
|
|
if (Bytes[1] == 0xDA)
|
|
return true;
|
|
}
|
|
return false;
|
|
}
|
|
|
|
|
|
|
|
public static bool IsImage(byte[] Bytes)
|
|
{
|
|
try
|
|
{
|
|
GetBitmap(Bytes);
|
|
}
|
|
catch (Exception)
|
|
{
|
|
return false;
|
|
}
|
|
return true;
|
|
}
|
|
|
|
public static Bitmap GetBitmap(byte[] BitmapBytes)
|
|
{
|
|
MemoryStream ms = ByteToStream(BitmapBytes);
|
|
Bitmap bmp = new Bitmap(ms);
|
|
ms.Dispose();
|
|
return bmp;
|
|
}
|
|
|
|
public static String ReadStringAt(Stream ms, int location)
|
|
{
|
|
long ogPos = ms.Position;
|
|
ms.Seek(location, SeekOrigin.Begin);
|
|
String str = ReadString(ms);
|
|
ms.Seek(ogPos, SeekOrigin.Begin);
|
|
return str;
|
|
}
|
|
|
|
public static int ReadIntAt(Stream ms, int location)
|
|
{
|
|
BinaryReader BinReader = new BinaryReader(ms);
|
|
long ogPos = ms.Position;
|
|
ms.Seek(location, SeekOrigin.Begin);
|
|
int i = BinReader.ReadInt32();
|
|
ms.Seek(ogPos, SeekOrigin.Begin);
|
|
return i;
|
|
}
|
|
public static bool HasBinaryContent(string content)
|
|
{
|
|
return content.Any(ch => char.IsControl(ch) && ch != '\r' && ch != '\n');
|
|
}
|
|
public static int ReadInt(Stream ms)
|
|
{
|
|
BinaryReader BinReader = new BinaryReader(ms);
|
|
int i = BinReader.ReadInt32();
|
|
return i;
|
|
}
|
|
|
|
public static int ReadBigEndainIntAt(Stream ms, int location)
|
|
{
|
|
long ogPos = ms.Position;
|
|
ms.Seek(location, SeekOrigin.Begin);
|
|
int i = ReadBigEndainInt(ms);
|
|
ms.Seek(ogPos, SeekOrigin.Begin);
|
|
return i;
|
|
}
|
|
|
|
public static int ReadBigEndainInt(Stream ms)
|
|
{
|
|
byte[] IntBytes = new byte[4];
|
|
ms.Read(IntBytes, 0x00, 4);
|
|
IntBytes = IntBytes.Reverse().ToArray();
|
|
int i = BitConverter.ToInt32(IntBytes, 0x00);
|
|
return i;
|
|
}
|
|
public static String GetRootFolder(string path)
|
|
{
|
|
while (true)
|
|
{
|
|
string temp = Path.GetDirectoryName(path);
|
|
if (String.IsNullOrEmpty(temp))
|
|
break;
|
|
path = temp;
|
|
}
|
|
return path;
|
|
}
|
|
|
|
public static String GenerateHash(byte[] Data)
|
|
{
|
|
SHA1 sha = SHA1.Create();
|
|
byte[] ShaBytes = sha.ComputeHash(Data);
|
|
return BitConverter.ToString(ShaBytes).Replace("-", "").ToUpper();
|
|
}
|
|
|
|
public static String ReadString(Stream ms, int limit = -1)
|
|
{
|
|
int i = 0xFF;
|
|
int counter = 0;
|
|
|
|
MemoryStream StringStream = new MemoryStream();
|
|
|
|
do
|
|
{
|
|
i = ms.ReadByte();
|
|
if (i == 0 || counter == limit)
|
|
break;
|
|
StringStream.WriteByte((byte)i);
|
|
counter += 1;
|
|
}
|
|
while (true);
|
|
|
|
byte[] StringData = StringStream.ToArray();
|
|
|
|
String str = Encoding.UTF8.GetString(StringData);
|
|
|
|
return str;
|
|
|
|
}
|
|
}
|
|
|
|
}
|