PDA

View Full Version : سوال: کمک در معدل سازی کد



debugger
سه شنبه 29 دی 1388, 13:05 عصر
دوستان عزیز من میخوام کد زیر را در سی شارپ بنویسم

کد زیر در VB6 هست و کارش اینه تعداد مشخصی بایت از یه فایل را میخونه و به 56 Xor میکنه و بعد به اخر اسم فایل Enc اضافه میکنه

خب دستور Xor را اصلا نتوتستم تو سی شارپ پیدا کنم



Private Sub File_Encryptor()
On Error Resume Next
Dim Enc As Byte
Dim Fname As String
Open File For Binary As #1
For I = 1 To 80000
Seek #1, I
Get #1, , Enc
Enc = Enc Xor 56
Seek #1, I
Put #1, , Enc
Next I
Close
Fname = File & "_.Enc"
Name File As Fname
Tekrar = File1.Path
End Sub


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


BinaryWriter bw = new BinaryWriter(File.Open("c:\\example.dat", FileMode.Open, FileAccess.ReadWrite))
bw.Seek(350, SeekOrigin.Begin);
bw.Write("something");
bw.Close();


با تشکر از همه دوستان

SMRAH1
سه شنبه 29 دی 1388, 14:15 عصر
سلام

عملگر Xor در C و C#‎ عملامت «^» است.در نتیجه برنامت(با فرض اینکه فایل خروجی کلا رونویسی بشه و نه اینکه اطلاعات به آخرش اضافه بشه) به این شکله :
BinaryReader br = new BinaryReader(File.Open("1.dat", FileMode.Open, FileAccess.Read));
BinaryWriter bw = new BinaryWriter(File.Open("2.dat", FileMode.OpenOrCreate, FileAccess.Write));

try
{
br.BaseStream.Seek(0, SeekOrigin.Begin);
byte[] b = new byte[1];
int count = br.Read(b, 0, 1);
while (count != 0)
{
b[0] ^= 56;
bw.Write(b[0]);
count = br.Read(b, 0, 1);
}
}
catch(Exception ex)
{
MessageBox.Show(ex.Message);
//Get Exceptions
}
finally
{
br.Close();
bw.Close();
}
MessageBox.Show("END");
البته این کد هنوز جای کار داره (باید قسمت Exception ها رو کامل مدیریت کنی).

موفق باشی

debugger
سه شنبه 29 دی 1388, 14:45 عصر
دوست عزیز ممنون از کد بسیار کامل شما

در کد vb6 بالا در حلقه for از 1 تا 80000 هزار به تریب جلو میره و یکی یکی با 56 xor میکنه در کد شما

b[0] ^= 56;

ایا فقط نقطه 0 ، xor میشه با 56 یا حلقه تا اخر فایل میره ؟؟ ، اون عملکردشو اگر امکانش هست بیشتر توضیح بدین ؟

راستی نمیشه کد را طوری نوشت که تو خود فایل اعمال کنه عمل xor را چون شما یه بار میخونی و بعد از اینکه xor کردی یه فایل دیگه ایجاد می کنی که خیلی زمان بر هست

SMRAH1
سه شنبه 29 دی 1388, 19:46 عصر
سلام
1) در هر بار اجرا (اگر به کد دقت کنی) دستوری داری به شکل :

count = br.Read(b, 0, 1);این دستور اطلاعات را از استریم br خوانده در آرایه b (پارامتر اول) قرار می دهد.به تعداد یک عدد (پارامتر سوم).البته این تعداد رو در ایندکس صفر ام (پارامتر دوم) به بعد آرایه قرار میده.خروجی ابن تابع هم تعداد بایتهایی است که خوانده شده (اگر نتواند عمل خواندن رو انجام بده تعداد بایتها خوانده شده صفر خواهد بود)
2) با توجه به اینکه در هر بار فقط یک عضو خونده میشه،پس تنها داده معتبر b[0] است برای همین فقط همون تغییر می کنه.
3) همونطور که گفتم عملگر «^» دو تا بایت رو XOR می کنه.در نتیجه عملگر «=^» دو تا بایت داده شده رو XOR می کنه و جواب رو در عملوند سمت چپ می نویسه.
4) شما می تونید تو همون فایلی که می خونید ،بنویسید.برای این کار کمی جستجو کنید در سایت نمونه هایی خوبی پیدا خواهید کرد.

موفق باشید

FastCode
سه شنبه 29 دی 1388, 20:18 عصر
دوست عزیز ممنون از کد بسیار کامل شما

در کد vb6 بالا در حلقه for از 1 تا 80000 هزار به تریب جلو میره و یکی یکی با 56 xor میکنه در کد شما

b[0] ^= 56;

ایا فقط نقطه 0 ، xor میشه با 56 یا حلقه تا اخر فایل میره ؟؟ ، اون عملکردشو اگر امکانش هست بیشتر توضیح بدین ؟

راستی نمیشه کد را طوری نوشت که تو خود فایل اعمال کنه عمل xor را چون شما یه بار میخونی و بعد از اینکه xor کردی یه فایل دیگه ایجاد می کنی که خیلی زمان بر هست

اگر دوست دارید که جای صفر چیز دیگه باشه به این روش هم میتونید عمل کنید.
static void Main(string[] args)
{
string path;
if (args.Length == 1)
path = args[0];
else
path = "file.dat";
BinaryReader br = null;
BinaryWriter bw = null;
try
{
System.IO.FileInfo info = new FileInfo(path);
int Length = (int)info.Length;
byte[] b = new byte[Length];
br = new BinaryReader(File.Open(path, FileMode.Open, FileAccess.Read)); br.Read(b, 0, Length); br.Close();
for (int n = 0; n != Length; n++) b[n] ^= 56;
bw = new BinaryWriter(File.Open(path, FileMode.OpenOrCreate, FileAccess.Write)); bw.Write(b); bw.Close();
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
}
finally
{
if (br != null) br.Close();
if (bw != null) bw.Close();
}
Console.WriteLine("END");
}
البته پاسخ SMRAH هم از جهت هایی بهتر از بنده است.
این روش سریعتر است.