PDA

View Full Version : بدست آوردن بیت ها با دلفی



sajioo
دوشنبه 28 آذر 1390, 00:57 صبح
سلام بر همه
دوستان فرض من اینه که یک کلیپ تصویری بر روی هارد ذخیره دارم . می خوام محتویات این کلیپ ( که مسلما به صورت صفر و یک) بر روی هارد ذخیره شده رو بدست بیارم .
چکار باید کرد؟
از کجا آدرس این کلیپ رو بر روی هارد بدست بیارم و چطوری محتویات هر بیت یا بایت آن را بیرون بکشم؟
لطفا راهنمایی کنید خیلی برام مهمه.
با تشکر فراوان

MohsenB
دوشنبه 28 آذر 1390, 09:04 صبح
سلام


راههای زیادی هست :


یکی از راهها خوندن به روش معمول کار با فایل با دستور Read هست .

راه بهتر و سریعترش کار با دستوراتی مثل Stream ها هست .

برا هر دوی اینها تو همین سایت بحث های زیادی شده یه جستجو بکنید حتما پیدا خواهید کرد .



موفق باشید

Felony
دوشنبه 28 آذر 1390, 20:02 عصر
0 و ۱ ؟ سیستم عاملی که داری توش برنامه مینویسی ویندوز هست و الان تو User Mode هستی , OK ؟!

sajioo
دوشنبه 28 آذر 1390, 20:17 عصر
بله آقا مجتبی ، سیستم عاملم ویندوزه . چطور؟

یوسف زالی
دوشنبه 28 آذر 1390, 20:42 عصر
منظور آقا مجتبی اینه که دوره صفر و یک مال زمان چارلز بابیج و بلز پاسکال بوده..
الان که با کارت پانچ کار نمی کنن!
همه چی کد 8 بیتیه.
در حقیقت پایین ترین سطح ممکن برای دسترسی به چیزی از حافظه 8 بیته. (یک بایت)
اگر منظور شما اینه که می خوای به FAT هارد دسترسی داشته باشی یه داستان دیگه هست.
شاید هم داری کاری مثل ریستور کردن فایل های پاک شده انجام می دی؟
اگر نه؛ کافیه در مود باینری فایل رو دقیقا مثل یک فایل باینری ساده باز کنی تا به اطلاعاتش دسترسی داشته باشی.
لزوما این داده ها برا برنامه نویس قابل درک نیست. برای درک اون باید کدک مربوطه رو به صورت باز داشته باشی.

Felony
دوشنبه 28 آذر 1390, 21:05 عصر
منظور اینکه اون نوع عملیات ها ( کار با سخت افزارها و نوستن و خواندن روی دیسک و ... ) در Kernel Mode صورت میگیره و Kernel Mode هم یک محیط Protected هست که به صورت مستقیم به سخت افزارها و منابع سیستم دسترسی داره و به همین دلیل کوچکترین اشتباهی در این مد منجر به فاجعه میشه و به همین دلیل شما در Ring3 که User Mode باشه به سر میبری و مجبوری هر چی سیستم عامل گفت بگی چشم و بیشتر از گلیمت نمیتونی پاتو دراز کنی , کدی که در User Mode مینویسی در Kernel Mode تحلیل میشه و اگر بخواد پاشو از گلیمش بیشتر دراز کنه Kernel Mode جلوشو میگیره , بنا براین تو User Mode نمیتونی این کاری که گفتی رو بکنی مگر اینکه Kernel Mode کد بزنی یا منظورت کلا چیز دیگه ای باشه .

قبل از این نوع کارها حتما کتاب Microsoft Windows Internals رو بخون , برای یک برنامه نویس ویندوز اون هم از نوع غیر دیتابیسیش! از نون شب واجب تره !

این لینک هم بد نیست http://en.wikipedia.org/wiki/Architecture_of_Windows_NT ولی اون Windows Internals یک دنیای دیگس ...

sajioo
دوشنبه 28 آذر 1390, 21:05 عصر
منظور آقا مجتبی اینه که دوره صفر و یک مال زمان چارلز بابیج و بلز پاسکال بوده..
الان که با کارت پانچ کار نمی کنن!
همه چی کد 8 بیتیه.
در حقیقت پایین ترین سطح ممکن برای دسترسی به چیزی از حافظه 8 بیته. (یک بایت)
بر منکرش لعنت :لبخند:
ولی بلاخره هر بایت از 8 بیت و هر بیت هم شامل یا صفر یا یک هستش دگه . منم می خوام برای مثال بدونم در یک فایل mp3 که روی هارد هستش ، پنجمین بیت مربوط پنجاهمین بایتش صفر است یا یک!
این شدنی است؟:متفکر:

MohsenB
دوشنبه 28 آذر 1390, 21:05 عصر
سلام


فکر کنم منظور آقای sajioo (http://barnamenevis.org/member.php?61492-sajioo) اینه که بتونن به بیت به بیت یک فایل دست پیدا کنن . حالا شاید بخوان رمزگذاریش کنن ، یا بیتهایی رو تغییر بدن ، یا یه برنامه کرک بنویسن و ......... . مثلما ما داده ای بنام بیت نداریم که بخوایم تو Read و یا چیز دیگه ای قرار بدیم تا برامون اطلاعات بده ، حداقل یه بایت برا ما برمیگردونه که اگر خواستیم به بیتش دست پیدا کنیم .... .

sajioo
دوشنبه 28 آذر 1390, 21:16 عصر
فکر کنم منظور آقای sajioo اینه که بتونن به بیت به بیت یک فایل دست پیدا کنن .
بله دقیقا محسن جان

حالا شاید بخوان رمزگذاریش کنن ، یا بیتهایی رو تغییر بدن ، یا یه برنامه کرک بنویسن و ......... .
فرضا بخوام بیتش رو تغییر بدم.

مثلما ما داده ای بنام بیت نداریم که بخوایم تو Read و یا چیز دیگه ای قرار بدیم تا برامون اطلاعات بده ، حداقل یه بایت برا ما برمیگردونه که اگر خواستیم به بیتش دست پیدا کنیم .... .
خوب یعنی من میتونم بایت مثلا 50 رو بگیرم و 8 بیت اون رو بدست بیاورم؟

MohsenB
دوشنبه 28 آذر 1390, 21:41 عصر
سلام


خوب این یه کد نمونه هست و خیلی ساده شده از خوندن یه بایت از یک فایل و اضافه کردن یه مقدار به اون و ذخیره اون مقدار تو جای قبلیش :


var f :TFileStream;
buf :Byte;
begin
//read
f:= TFileStream.Create('z:\tt.txt',fmOpenReadWrite);
f.Seek(4,1);
f.Read(buf,1);
//write
f.Seek(-1,1);
buf:= buf + 1;
f.Write(buf,1);
//close
f.Free;


توضیح اینکه این کد بایت چهارم از فایل "tt.txt" رو میخونه و یه واحد بهش اضافه میکنه و تو همون جای قبلیش ذخیره میکنه .


موفق باشید

sajioo
دوشنبه 28 آذر 1390, 21:46 عصر
خوب این یه کد نمونه هست و خیلی ساده شده از خوندن یه بایت از یک فایل و اضافه کردن یه مقدار به اون و ذخیره اون مقدار تو جای قبلیش :
محسن عزیز بسیار ممنون
فقط میشه یک توضیح کوچیک بدی که مثلا این کد چندمین بایت رو میگیره و چندمین بیت اون بایت روتغییر میده؟

MohsenB
دوشنبه 28 آذر 1390, 21:53 عصر
سلام


برای کار کردن روی بیت ها هم باید از دستوراتی مثل دستورات زیر استفاده کنید:


این کدها رو میتونید جای خط 10 تو کدهای بالا قرار بدین ( بجای اضافه کردن ) :


buf:= (1 shl (6{SetBit}-1)) or buf; //set bit 6 to 1

buf:= (not(1 shl (6{SetBit}-1))) and buf; //set bit 6 to 0

buf:= (1 shl (6{SetBit}-1)) xor buf; //not bit 6

sajioo
دوشنبه 28 آذر 1390, 21:56 عصر
یه واحد بهش اضافه میکنه و تو همون جای قبلیش ذخیره میکنه .
محسن جان منظورت اینه که مثلا من نمیتونم بایت چهارم رو بگیرم و به برنامه بگم اگر بیت پنجمش صفر بود اونو یک کن . این کارو میشه کرد؟
تا اینجاشم خیلی کمکم کردی

MohsenB
دوشنبه 28 آذر 1390, 22:09 عصر
چرا نمیتونی

کد اولی رو که نوشتم بایت چهارم رو میگیره ، که همون طوری که معلومه یه بایت یعنی هشت بیته یعنی یه عددی بین 0 تا 255 هست ، بعد به اون یکی اضافه میکنه و تو همون جایی که بود ذخیره میکنه .


اگر میخواید بیتی رو چک کنید که برا مثال 1 هست یا نه این طور مینویسید :


if (buf and (1 shl (5{CheckBit}-1)))>0 then //for check bit is 1

برا چک 0 بودنش هم بجای "بزرگتر" ،"مساوی" رو بنویسید .


اگر هم قراره بدون چک کردن یه بیت اونو مقدار بدین از یکی از کدهای پست 10 اسفاده کنید .


البته همه اینا یه روش هستن ممکنه از روشهای دیگه هم بتونید این کارها رو انجام بدین ، همشون مثل یه بازی با اعدادن .


موفق باشید