PDA

View Full Version : سوال: نوشتن و خواندن فایل روی حافظه موقت



joooje
چهارشنبه 04 آبان 1390, 16:40 عصر
سلام به دوستان
من یه سوال دارم در مورد امن کردن فایل
من یه فایل با حجم کم دارم (مثلا یه عکس) که برام تقریبا مهم هست
اون رو کد کردم
حالا میخوام که برای خوندن اون، اون رو روی رم دیکد کنم و بعد از استفاده مجددا اون رو از روی رم پاک کنم
ممنون میشم راهنمایی کنید
یا اگر راه بهتری موجود هست برای این کار معرفی کنید
بازم ممنون

یوسف زالی
چهارشنبه 04 آبان 1390, 22:56 عصر
سلام.
اگر کدینگ شما یک به یک هست به سادگی یا بیت مپ این کارو کنید.
به طور مثال یک تصویر رو پیکسل به پیکسل با یک عکس پایه xor کنید و نتیجه رو به عنوان کد داشته باشید، برای دی کد ، تصویر کد شده که خودش یک تصویره رو لود کنید و دوباره با پایه xor کنید.
این ساده ترین روشه

joooje
چهارشنبه 04 آبان 1390, 23:33 عصر
با سلام و ممنون از پاسختون
اگه یه نگاهی به ستاره های من تو انجمن بندازید میبینید که من همون دوتاشم به زور سبز کردم !!!
راسش من یکم تازه کارم و اصلا متوجه توضیحاتتون نشدم
روش کدینگ رو خودم نوشتم، نمیدونم منظورتون از یک به یک دقیقا چی هست
در مورد xor هم ممنون میشم یا بیشتر راهنمایی کنید و یا منبع معرفی کنید تا بخونم
البته در مورد فایل من ،اون تصویر تنها یک مثال بود ، فرمت فایل من میتونه متغییر باشه، مثلا یه فایل word باشه
بازم ممنون

joker
پنج شنبه 05 آبان 1390, 01:22 صبح
توي دلفي يه چيزي داريم به اسم TMemoryStream همين كاري كه ميخواي را برات انجام ميده (‌ اسمش را توي گوگل سرچ كني مثالهاي زيادي برات هست )

developing
پنج شنبه 05 آبان 1390, 09:12 صبح
با سلام

با استفاده از عملگر xor و يك مقدار پايه مي تونيد يك مقدار را كد كنيد و با همون xor كردن دوباره به مقدار اوليه برگرديد مثل:


CodeValue := YourValue XOR BaseValue ;

DecodeValue := CodeValue XOR BaseValue;


در مثال بالا شما از يك مقدار پايه براي كد كردن و ديكد كردن استفاده مي كنيد.(اين مهم ترين ويژگي xor هست كه از اون براي كد كردن مقادير به وفور استفاده مي شه.
با استفاده از راهنمايي بالا و همونطور كه yousijoon (http://barnamenevis.org/member.php?70247-yousijoon) عزيز گفتند مي تونيد براي مقدار پايه ي خودتون از يه عكسي كه طول و عرض هم اندازه با عكس خودتون داره استفاده كنيد اونوقت هر پيكسل عكستون رو با پيكسل متناظر با عكس پايه xor كنيد در اينجا عكس شما كد مي شه.
و هروقت عكس كد شده رو با عكس پايه xor كنيد اونوقت عكس اوليه ي شما بدست مي آيد.

حالا اگر فايل ديگري رو بخوايد كد كنيد به روش بالا فقط مقادير شما تغيير خواهد كرد.
در ضمن نيازي نيست كه مقدارهاي پايه ي شما حتما با مقدارهاي اوليه اي كه مي خواهيد كد كنيد يكي باشند فقط كافيه كه الگوريتم تكراري كه مي نويسيد براي ديكد هم بشه از اون براي بدست آوردن مقدار پايه اي كه با اون كد كردن رو انجام داديد استفاده كرد.

joooje
پنج شنبه 05 آبان 1390, 10:15 صبح
ممنون از توضیحاتتون
من با توجه به توضیحاتتون یه جستجو هایی انجام دادم و یه چیزایی رو پیدا کردم
ولی سوال اصلی من این نیست که چطور فایلم رو کد کنم- چون این قسمت رو انجام دادم
سوال من اینه که این فایل رو برای دیکد کردن روی هارد ذخیره نکنم که کسی بتونه اونو کپی کنه
میخوام اون رو روی رم دیکد کنم و از اونجا بخونم تا هر کسی به راحتی نتونه به فایل اصلی دسترسی پیدا کنه
در مورد TMemoryStream هم جستجو کردم ولی چیز زیادی که به دردم بخوره رو پیدا نکردم، البته باز هم میگردم
ممنون میشم اگر دوستان باز هم راهنمایی کنند.

Felony
پنج شنبه 05 آبان 1390, 10:37 صبح
اگر میخواین از Xor استفاده کنید نیازی به MemoryStream و ذخیره کردن نیست :

var
X, Y: Integer;
tempBitmap: TBitmap;
begin
tempBitmap:= TBitmap.Create;
try
tempBitmap.Assign(Image1.Picture.Graphic);
Image1.Picture.Bitmap:= tempBitmap;
finally
tempBitmap.Free;
end;

for X := 0 to Image1.Picture.Bitmap.Width - 1 do
for Y := 0 to Image1.Picture.Bitmap.Height - 1 do
Image1.Canvas.Pixels[X, Y]:= Image1.Canvas.Pixels[X, Y] Xor X;
end;

joooje
پنج شنبه 05 آبان 1390, 12:02 عصر
سلام به همگی
من نمیدونم چرا بحث داره به این سمت میره!!!
من اصلا نمیخوام فایلم رو کد کنم که نحوه کد کردن رو به من میدید
من یه فایل کد شده دارم (قبلا هم گفتم لزوما عکس نیست، هر فایلی ممکنه باشه - پسXor نمیتونه راه حل باشه! ) که میخوام اون رو برای خواندن اطلاعاتش روی هارد و یه آدرس مشخص دیکد نکنم
میخوام بتونم اون رو روی رم دیکد بکنم و از اونجا بخونمش
اینو پیدا کردم
ولی نمیدونم آیا این به درد کار من میخوره یا نه؟ فکر کنم این کد 10 تا فایل رو به حافظه میبره ولی اینکه بعد چطور داره میخونتشون رو من نمیفهمم!
ممنون میشم راهنمایی کنید


public
{ Public declarations }
stream:array[1..10]of <SPAN class=highlight>TMemoryStream</SPAN>;




for I := 1 to 10 do
begin
stream[i]:= <SPAN class=highlight>TMemoryStream</SPAN>.Create;
stream[i].LoadFromFile('e:\my.dfm');


end;




procedure TForm1.Button9Click(Sender: TObject);
var

TempForm1: Tform2;
i:integer;
begin


i:=strtoint(memNum.Text); //memNum.Text is index for stream
TempForm1 := tform2.Create (Application);


stream[i].ReadComponentRes(TempForm1) ;


form2.Free;
form2 := TempForm1;
form2.Show;




end;

Felony
پنج شنبه 05 آبان 1390, 12:35 عصر
کار کدی که در بالا گذاشتید کلا چیز دیگه ای هست ؛ شما بهتره در مورد کار با کلاس TMemoryStream تحقیق کنید و ببینید چه طور کار میکنه چون کلاس بسیار ساده ای هست و متد پیچیده ای نداره ، توسط تابع LoadFromFile فایل کد شده رو باز میکنید و بعد هم با استفاده از یک بافر و متدهای مثل Read و ReadBuffer فایل رو تکه تکه میخونید و دیکد میکنید .

تو بخش نمونه سورس ها نمونه برنامه ای قرار دادم که یک فایل رو در Thread جدا کپی میکنه ( برای نمایش روند عملیات کپی ) که در اون برنامه از کلاس TMemoryStream استفاده شده ، میتونید سورس اون مطالعه کنید ، تو نت هم سورس های بسیار ساده تری می تونید پیدا کنید .

MohsenB
پنج شنبه 05 آبان 1390, 13:18 عصر
سلام


ببینید روش کلی اینه :

1- یک متغییر از نوع TMemoryStream تعریف کنید .

2- اونو توسط متد Create() بسازید و فایلی رو که میخواید اونو باز کنید بهش بدین .

2.5- اگر تو این مرحله لازم دارین این استریم رو دیکد کنید و اونو تو همون استریم یا توی یه ستریم دیگه کپی کنید .

3- تو این مرحله دوراه دارین یا از یه کامپوننت استفاده کنید که بتونه از استریم بخونه ( مثلا یه همچین تابعی داشته باشه : LoadFromStream() ) و یا داد ها رو از استریم خودتون بخونید و به چیزی تبدیل کنید که لازم دارین .



موفق باشید .

joooje
پنج شنبه 05 آبان 1390, 18:56 عصر
سلام و ممنون از راهنماییتون
من طبق گفته ی شما یک TMemoryStream ساختم و بعد کلی خودمو کشتم و اینورو انور گشتم تا نحوه نوشتن توی اون رو هم بلد شدم که شد این نمونه پایین
آیا این کد رو درست نوشتم و اصلا همین چیزی هست که من میخوام یا نه؟
و خب اگه همینه من الان میتونم یک متن رو به حافظه ببرم و بخونم، برای یه فایل چیکار بکنم؟
و یه سوال دیگه اینکه چرا وقتی MemoryStream.Position رو از 0 مثلا به 5 تغییر میدم از کاراکتر 5 به بعد رو نمیخونه و ایراد میگیره؟ مگه نباید اینطور باشه؟
ممنون میشم راهنمایی کنید... باور کنید خودمم بیکار نموندم و کلی جستجو کردم و متن انگلیسی خوندم !!



procedure TForm1.Button1Click(Sender: TObject);
var
LastString,MyString: string;
MemoryStream: TMemoryStream;
begin
MyString := 'Hello, how are you doing today?';
MemoryStream := TMemoryStream.Create;
try
MemoryStream.WriteBuffer(Pointer(MyString)^, Length(MyString));
MemoryStream.Position := 0;
SetLength(LastString, MemoryStream.Size);
MemoryStream.ReadBuffer(Pointer(LastString)^, MemoryStream.Size);
Caption := LastString;
finally
MemoryStream.Free;
end;
end;

Felony
جمعه 06 آبان 1390, 11:10 صبح
چه متنی خوندی ؟
نوشتن اون کد هیچ کاری نداره ، شما حتی به خودت زحمت خوندن متد های کلاس TMemoryStream رو ندادی که ببینی خودش متد LoadFromFile داره !

var
MemoryStream: TMemoryStream;
Buf: Array [1 .. 1024] of Byte;
begin
MemoryStream := TMemoryStream.Create;
try
MemoryStream.LoadFromFile('D:\Mp3\Irani\1 2 3.MP3');
MemoryStream.Seek(0, soFromBeginning);
while MemoryStream.Position <> MemoryStream.Size do
begin
MemoryStream.Read(Buf, SizeOf(Buf));
//
// Decode your buffer here & and assign it to a temp buffer , finally use it
//
if (MemoryStream.Position + SizeOf(Buf)) <= MemoryStream.Size then
MemoryStream.Position := MemoryStream.Position + SizeOf(Buf)
else
MemoryStream.Position := MemoryStream.Position + (MemoryStream.Size - MemoryStream.Position);
end;
finally
MemoryStream.Free;
end;
end;

joooje
جمعه 06 آبان 1390, 19:00 عصر
سلام و ممنون از راهنماییتون
فقط چنتا تا سوال دیگه
1-فرض کنید من به جای اون فایل آهنگ یه فایل عکس رو به حافظه میبرم و حالا یه image رو فرمم دارم. چطور توی اون نشونش بدم؟
یا مثلا همین آهنگ رو چطور میتونم الام پخشش کنم
2- الان این فایل آهنگ رو به حافظه ارسال کردم، آیا تنها با برنامه خودم میتونم اونو اجرا کنم یا مثلا میتونم توی پلیر ویندوز هم کاری کنم که اونو اجرا کنه؟
3- آیا بعد از ارسال این فایل به حافظه میتونم اون فایل اصلی رو پاک کنم؟
4- برای دیکد کردن فایلم یه MemoryStream جدید بسازم یا میتونم تو همون هم این کار رو بکنم؟
ممنون میشم راهنمایی کنید

Felony
شنبه 07 آبان 1390, 05:14 صبح
1-فرض کنید من به جای اون فایل آهنگ یه فایل عکس رو به حافظه میبرم و حالا یه image رو فرمم دارم. چطور توی اون نشونش بدم؟
توسط متد Assign .


یا مثلا همین آهنگ رو چطور میتونم الام پخشش کنم
کامپوننت MediaPlayer همره دلفی یک Wrapper برای MediaPlayer ویندوز هست ولی قابلیت خواندن از Stream براش پیاده سازی نشده ؛ باید دنبال کامپوننتی باشید که قابلیت خواندن از استریم رو داشته باشه .


2- الان این فایل آهنگ رو به حافظه ارسال کردم، آیا تنها با برنامه خودم میتونم اونو اجرا کنم یا مثلا میتونم توی پلیر ویندوز هم کاری کنم که اونو اجرا کنه؟
این فایل در AdresSpace حافظه اختصاص یافته به برنامه شما بار شده و نرم افزار دیگه ای نمیتونه بهش دسترسی داشته باشه ، مگر با روشهایی مثل Memory Mapping .


3- آیا بعد از ارسال این فایل به حافظه میتونم اون فایل اصلی رو پاک کنم؟
بله ؛ وقتی فایل رو داخل MemoryStream بار کردید میتونید فایل اصلی رو حذف کنید و اون فایل هم تا زمان Free شدن MemoryStream از طریق اون در دسترس خواهد بود .


4- برای دیکد کردن فایلم یه MemoryStream جدید بسازم یا میتونم تو همون هم این کار رو بکنم؟
بستگی به الگوریتم Code و Decode تون داره ؛ برای شما بهتره یک MemoryStream کمکی بسازید .