PDA

View Full Version : سوال: محاسبه crc32 فایل



dooste_2002
شنبه 05 دی 1394, 17:46 عصر
با سلام خدمت اساتید گرامی
من میخوام Crc32 هر فایل رو بدست بیارم ولی متد کامل و جالب گیر نیاوردم اگه امکانش هم کمکم کنید
ممنون میشم کمکم کنید چون شدیداً به اون نیاز دارم

Reza-HNA
شنبه 05 دی 1394, 22:23 عصر
قبلا سوال مشابهی رو همینجا پرسیده بودم کسی جواب نداد خودم نوشتم :
این متودیه که توی برنامه های هگز ادیتور هم ازش استفاده شده (فقط یه مشکلی برای شما داره که 4 بایت آخر فایل رو چک سام نمیگیره یکم دست کاریش کن درست میشه ) :




string text = txt_FileAddress.Text;
if (File.Exists(text))
{
try
{
FileStream input = new FileStream(text, FileMode.Open, FileAccess.ReadWrite);
BinaryReader reader = new BinaryReader(input);
BinaryWriter writer = new BinaryWriter(input);
long num = (input.Length - 4);
if (num >= 0)
{
byte[] buffer = new byte[num];
buffer = reader.ReadBytes(Convert.ToInt32(num));
int num2 = 0;
for (var i = 0; i < num; i++)
{
byte num4 = buffer[i];
num2 = (num2 + num4);
}
input.Close();
MessageBox.Show(string.Format("CRC32: 0x{0:X}", num2));
}
}
catch (IOException exception1)
{
MessageBox.Show("Unable to open file!");
}
}
else
{
MessageBox.Show(("File " + txt_FileAddress.Text + " does not exist!"));
}

اینم متودیه که قدیم ها توی نت پیدا کردم ولی خب اون چیزی که من میخواستم نبود شاید به کارت بیاد :




public string GetCRC32(string sFileName)
{
try
{
FileStream FS = new FileStream(sFileName, FileMode.Open, FileAccess.Read, FileShare.Read, 8192);
int CRC32Result = unchecked((int)0xFFFFFFFF);
byte[] Buffer = new byte[4097];
int ReadSize = 4096;
int Count = FS.Read(Buffer, 0, ReadSize);
int[] CRC32Table = new int[257];
int DWPolynomial = unchecked((int)0xEDB88320);
int DWCRC = 0;
int i = 0;
int j = 0;
int n = 0;
//Create CRC32 Table
for (i = 0; i <= 255; i++)
{
DWCRC = i;
for (j = 8; j >= 1; j--)
{
if ((DWCRC & 1) != 0)
{
DWCRC = ((DWCRC & unchecked((int)0xFFFFFFFE)) / 2L) & 0x7FFFFFFF;
DWCRC = DWCRC ^ DWPolynomial;
}
else
{
DWCRC = ((DWCRC & unchecked((int)0xFFFFFFFE)) / 2L) & 0x7FFFFFFF;
}
}
CRC32Table[i] = DWCRC;
}
//Calcualting CRC32 Hash
while (Count > 0)
{
for (i = 0; i < Count; i++)
{
n = (CRC32Result & 0xFF) ^ Buffer[i];
CRC32Result = ((CRC32Result & unchecked((int)0xFFFFFF00)) / 0x100) & 0xFFFFFF;
CRC32Result = CRC32Result ^ CRC32Table[n];
}
Count = FS.Read(Buffer, 0, ReadSize);
}
return Convert.ToString(~(CRC32Result), 16).ToUpper();
}
catch (Exception ex)
{
return "";
}
}

dooste_2002
جمعه 11 دی 1394, 12:58 عصر
مرسی خیلی خیلی ممنون
چک میکنم ببینم چطوره

dooste_2002
جمعه 18 دی 1394, 09:36 صبح
سلام اساتید بزرگوار
من هنوز واسه این سوالم جوابی پیدا نکردم
چمد متد پیدا کردم ولی هیچ کدوم درست جواب نمیده
ممنون میشم کمکم کنید

Reza-HNA
جمعه 18 دی 1394, 19:58 عصر
سلام اساتید بزرگوار
من هنوز واسه این سوالم جوابی پیدا نکردم
چمد متد پیدا کردم ولی هیچ کدوم درست جواب نمیده
ممنون میشم کمکم کنید

یعنی چی درست جواب نمیده ؟ میشه منظورتون رو دقیق تر توضیح بدید ؟:متفکر:
چون کدی که گزاشتم متد صحیحیه و اگر با Hex Workshop هم Crc32 فایل رو بگیرید همین مقدار رو میده.
اگر اشتباه نکنم ICSharpCode.SharpZipLib و Ionic.Zip هم متدهای CRC32 داشتن اون ها رو هم تست کن.

dooste_2002
یک شنبه 20 دی 1394, 00:54 صبح
با سلام و تشکر
با چند سایت crc32 آنلاین چک کردم
پاسخ کد شما :0x13B37
پاسخ سایت های دیگه : 4ad029c1
اگه من جایی اشتباه میکنم راهنمایی بفرمایید
ممنون

dooste_2002
دوشنبه 21 دی 1394, 20:04 عصر
با سلام و خسته نباشید
اگه کسی از اساتید میتونند کمکم کنند ممنون میشم