مشاهده نسخه کامل
: چگونه بيت به بيت فايلي رو جستجو كنم
rouhallah
08-02-2007, 09:21
بنام خدا
با سلام
دوباره پس از مدتي كه از دستم راحت بودين( اونم بخاطر امتحانات ) اومدم تا با سوالاتم سرتونو درد بيارم
اما اينبار سوالم در مورد بيتهاي رايانهاي هست. و اون اينكه در زبان سي آيا تابعي هست يا راهي هست كه بشود از ابتدا يا انتهاي يك فايل به تعداد مشخصي بيت مثلاً چهار بيت چهار بيت فايل رو جستجو يا اسكن نمود
ميدونم يه اعمالي رو در اين زبان ميشه رو بيتها انجام داد و براي اين منظور هم عملگرهايي وجود داره اما اين كه آيا تابعي هم براي جستجوي بيت به بيت در اين زبان باشه رو نميدونم.
لطفاً اگر راهي بلديد كمكم كنيد با تشكر از هم شما
hamidreza_buddy
08-02-2007, 21:22
توی c واحد دسترسی به داده ها بایت هست و نمیشه یک فایل رو بیت به بیت خوند و اگه این کار نیازه باید اون رو بایت به بایت خوند و برای هر بایت همۀ بیت ها رو چک کرد.
rouhallah
09-02-2007, 14:43
توی c واحد دسترسی به داده ها بایت هست و نمیشه یک فایل رو بیت به بیت خوند و اگه این کار نیازه باید اون رو بایت به بایت خوند و برای هر بایت همۀ بیت ها رو چک کرد.
با سلام دوباره
ببخشيد بذاريد من مشكلم رو بگم شايد راه حلي برايش داشته باشيد
من ميخوام از ابتدا يا از انتهاي يك فايل (زياد فرق نميكنه) فايلي رو به صورت چهار بيت چهار بيت بخونم و براي هر آرايشي خاص از اين چهار بيت ها يك شرط تعيين كنم و اگر مثلاً فلان چهاربيت به عنوان مثال: 1001 خوانده شد يك عملي انجام شود كه چون اين چهار بيت ميباشد فكر نكنم بتوان با بررسي بايت به هدفم برسم
اصلاً فرض كنيم من بيام و هشت بيت هشت بيت بخونم آيا در اين صورت مي توان آرايش هر بايت را تشخيص داد
در ضمن اگر من فرض خود را عوض كنم باز هم به بيتهاي كمتر از هشت نياز دارم مثل 7 بيت 6 بيت تا 1 بيت
پس اگر راهي به ذهنتان ميرسد كه بشود حتي يك بيت از يك بايت را نيز تشخيص داد كمكم كنيد
متشكر م
سلام.
توضیحات دوست عزیزم "hamidreza_buddy" کاملا صحیح هست.
شما برای اینکه بیت ها رو بتونید چک کنید میتونید از bits operator استفاده کنید. ( & یا >> یا.....)
بطور صریح تابعی برای این کار وجود نداره ولی میشه به راحتی این کار رو انجام داد.
کافی شما عدد یک ( 1 ) رو به اندازه ی index مورد نظرتون به سمت چپ شیفت بدید و حاصل رو با متغییر
مورد نظرتون & کنید. مشخصه که اگه در index مورد نظر 1 باشه حاصل 1 و اگه 0 باشه حاصل 0 هست.
برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید
نمونه که براتون میذارم برای چک کردن متغییر های int هست (که 32 بیتی هست.)
برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید
اگه مشکلی پیش اومد اطلاع بدید.
rouhallah
09-02-2007, 15:20
سلام.
توضیحات دوست عزیزم "hamidreza_buddy" کاملا صحیح هست.
شما برای اینکه بیت ها رو بتونید چک کنید میتونید از bits operator استفاده کنید. ( & یا >> یا.....)
بطور صریح تابعی برای این کار وجود نداره ولی میشه به راحتی این کار رو انجام داد.
کافی شما عدد یک ( 1 ) رو به اندازه ی index مورد نظرتون به سمت چپ شیفت بدید و حاصل رو با متغییر
مورد نظرتون & کنید. مشخصه که اگه در index مورد نظر 1 باشه حاصل 1 و اگه 0 باشه حاصل 0 هست.
برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید
نمونه که براتون میذارم برای چک کردن متغییر های int هست (که 32 بیتی هست.)
برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید
اگه مشکلی پیش اومد اطلاع بدید.
با سلام به شما دوست عزيز جناب someone كه در رابطه با مشكلات من شما كمكهاي شاياني به من كرديد
من اصلاً قصد ندارم خود را بيش از اون چيزي كه هستم نشون
بدم اگه ميبينيد شايد سوالاتم شايد در حد يك مبتدي نباشه فقط و فقط به خاطر اينه كه من يكم منطق خوبي دارم و به مسائل رايانهاي نيز با همون منطقه كه فكر ميكنم كه نتيجش چنين سوالاتي هست كه ميبينيد
پس خواهش ميكنم در جوابهايي كه به سوالاتم ميدهيد كمي سطح پايين تر صحبت كنيد مخصوصاً در مورد اصطلاحات برنامه نويسي
من اگه تو جملاتتون بحث منطقي خاي از اصطلاحات پيچيده كه تا اكنون نشنيدم باشه ميتونم اون چيزي كه ميگوييد رو بفهمم
حالا با اين توضيحاتي كه دادم
چند تا سوال داشتم
1 منظور شما از جمله کافی شما عدد یک ( 1 ) رو به اندازه ی index مورد نظرتون به سمت چپ شیفت بدید و حاصل رو با متغییر
مورد نظرتون & کنید. چيست ؟
آيا منظورتون اينه كه مثلاً من گفتم ميخواهم چهار بيت چهار بيت فايلي رو چك كنم اينه كه بايد عدد( 1 )را به اندازه چهار بيت به سمت چپ شيفت دهم؟
2 و اونجايي كه گفتيد بايد حاصل رو با متغير مورد نظر خود & كنم چون من نمونه برنامهاي نديدم اگه توضيح بديد كدوم متغيري رو بايد تعيين كنم كه حاصل با اون متغير & بشه ممنون ميشوم؟
3 و سوال آخرم اينه كه اين برنامتون در باره" چک کردن متغییر های int " دقيقاً چه كاري انجام ميده
اگه به سوالاتم جواب بدهيد مخصوصاً اين آخري من رو هم كم كم وارد جمع شما برنامه نويسان حرفهاي ميكنيد و با اين كار من رو خيلي خوشحا ميكنيد مطمئن باشيد زحمت شما بي اثر نخواهد بود چون من تلاش خودم رو خواهم كرد و در پي تلاش حتماً پيروزي هست
با تشكر
والسلام
سلام دوست عزیز.
من کاری نکردم و خوشحال میشم اگه بتونم کمکی کرده باشم.
فرض کنید که شما یک متغییر از نوع int دارید که 32 بیتی هست. اگه شما مقدار این متغییر رو برابر
با 1 قرار بدید به این صورت در این 4 بایت قرار میگیره :
برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید
یا مثلا عدد دو 2 :
برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید
حالا اگه شما عدد 1 رو مثلا 4 بار به سمت چپ شیفت بدید دارید :
برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید
احتمالا با ضرب منطقی آشنا هستید (&) که به این صورت عمل میکنه:
برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید
خب حالا در نظر بگیرید که شما عددی دارید مثل 2 که به صورت بالا در حافظه ذخیره شده.
برای اینکه بیت دوم رو چک کنید کافیه عدد 1 رو یکبار به سمت چپ شیفت بدید که میشه 00000010
(البته بایت اول) و با عدد 2 and کنید (& یا همون ضرب منطقی ) حاصل به این شکل در میآد :
برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید
یعنی بیت دوم TRUE هست یا مقدارش برابر یک هست.
به همین ترتیب اگه بخواید باقی بیت ها رو چک کنید کافی عدد 1 رو به اندازه مورد نظرتون شیفت بدید.
(به سمت چپ ). مثلا برای چک کردن بیت اندیس 4 ام کافی هست عدد 1 رو 4 بار شیفت بدید و با عدد مورد نظرتون & کنید و حاصل این ضرب رو بررسی کنید.
درضمن بیاد داشته باشید که شمارش از 0 شروع میشه.
باز هم اگه مشکلی بود اطلاع بدید.
rouhallah
12-02-2007, 22:16
با سلام
راستي اين طور كه معلومه با اين توضيحات شما نميشه در يك عنصر آرايه يك بيت رو ذخيره نمود
دوباره سلام.
فرض میکنیم شما یک آرایه ی 2 تایی از اعداد داشته باشید. این به این معنی هست که شما
دو متغییر 32 بیتی از int دارید. که مثلا بصورت زیر به اونها دسترسی دارید :
برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید
خب مثل قبل ما به تک تک بیت های این دو عضو دسترسی داریم. برای اینکه بتونیم بیت ها رو دستکاری کنیم
باز میتونیم از boolean operator استفاده کنیم. مثل And یا Or یا Xor ( & و | و ^ ).
فرض کنیم عدد اول ما 1 باشه که به این صورت ذخیره شده :
برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید
خب فرض کنید ما میخوایم بیت دوم رو یک کنیم. یکی از راهها اینه که این عدد رو با عدد 2 OR کنیم.
برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید
نتیجه به این شکل میشه :
برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید
که نتیجش میشه عدد 3. در نمونه ای که براتون گذاشتم به اول عدد 1 رو یک بار به سمت چپ شیفت
دادم که نتیجش میشه عدد 2 و بعد با Int مورد نظرم Or کردم :
برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید
باز اگه مشکلی بود اطلاع بدید.
rouhallah
13-02-2007, 13:26
با سلام
شايد من سوالم رو درست مطرح نكردم
منظورم اين است كه اگه ما مثلاً يك كاراكتر داشته باشيم كه هشت بيت داشته باشد آيا ميتونيم اين هشت بيت رو تو يك آرايه يك بعدي قرار دهيم كه داراي 8 عنصر است.
به صورتي كه در هر عنصر اين آرايه يك بيت از هر هشت بيت اون كاراكتر ذخيره بشه
مثلاً كاراكتر A كه كد اسكي اون 65 ميباشد به صورت دودويي ميشود 00100001
اگه بخواهيم اين بيتهاي كاراكتر A را در آرايهاي ذخيره كنيم ميتونيم آرايهاي 8 عنصري تعريف كنيم كه هر كدام از اين بيتها تو يك عنصر اون آرايه قرار بگيره؟
اگه ميشه لطفاً راهنماييم كنيد.
با تشكر
با سلام
شايد من سوالم رو درست مطرح نكردم
منظورم اين است كه اگه ما مثلاً يك كاراكتر داشته باشيم كه هشت بيت داشته باشد آيا ميتونيم اين هشت بيت رو تو يك آرايه يك بعدي قرار دهيم كه داراي 8 عنصر است.
به صورتي كه در هر عنصر اين آرايه يك بيت از هر هشت بيت اون كاراكتر ذخيره بشه
مثلاً كاراكتر A كه كد اسكي اون 65 ميباشد به صورت دودويي ميشود 00100001
اگه بخواهيم اين بيتهاي كاراكتر A را در آرايهاي ذخيره كنيم ميتونيم آرايهاي 8 عنصري تعريف كنيم كه هر كدام از اين بيتها تو يك عنصر اون آرايه قرار بگيره؟
اگه ميشه لطفاً راهنماييم كنيد.
با تشكر
سلام دوست عزیز , اگر منظورت اینه که می خوای یک بایت رو در یک آرایه ذخیره کنی که هر عضو اون آرایه , یک متغیره باید همون طوری که somone گفت یه بایت یه بایت اطلاعاتتو بخونی و بیت هاشو در آری
در غیر این صورت می تونی بایت خونده شده را عینا در یک متغیر ذخیره کنی و هر بیت رو که لازم داشتی با عملیات شیفت خارج کنی.
البته اگر هم با اسمبلی کارکرده باشی می تونی یه برنامه بنویسی که بیت به بیت برات اطلاعات رو بگیره و بعد با یه برنامه c اونو لینک کنی.
ضمنا اگه فضولی نیست. اگه داری روی یک برنامه دی اسمبل کار می کنی(احساس کردم شاید اینجوریه:cool: ) برای چک کردن دستورا می تونی از جدول استفاده کنی
soheila_c++
13-02-2007, 19:32
برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید
[این برنامه به این صورت کار میکند که در هر نوبت مقدار i طوری مشخص میشود که با هر مقایسه فقط یکی از بیت ها تنظیم میشود.چون در یک بایت . بیت با مرتبه بالاتر بیانگر مقدار128 است از این مقدار به عنوان نقطه شروع استفاده کردیم.در هر دور حلقه i نصف میشه.این کار باعث میشه تا بیت بعدی 1بشه و بقیه بیت ها 0بشن .به این صورت در هر دور حلقه یکی از بیت های ch تست میشن.اگر این بیت برابر1باشه مقایسه نتیجه ی درست بازمیگردونه و عدد 1 به خروجی فرستاده میشه.در غیر این صورت 0به خروجی فرستاده میشه......البته همینطور که someone گفتند بهتره از عملگر شیفت(در این برنامه شیفت به راست) استفاده بشه چون سرعت بیشتری نسبت به عمل ضرب و تقسیم داره.در واقع بهتره به جای i=i/2 بنویسیم i >>1 =i
soheila_c++
14-02-2007, 10:06
برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید
این برنامه به این صورت کار میکند که در هر نوبت مقدار i طوری مشخص میشود که با هر مقایسه فقط یکی از بیت ها تنظیم میشود.چون در یک بایت . بیت با مرتبه بالاتر بیانگر مقدار128 است از این مقدار به عنوان نقطه شروع استفاده کردیم.در هر دور حلقه i نصف میشه.این کار باعث میشه تا بیت بعدی 1بشه و بقیه بیت ها 0بشن .به این صورت در هر دور حلقه یکی از بیت های ch تست میشن.اگر این بیت برابر1باشه مقایسه نتیجه ی درست بازمیگردونه و عدد 1 به خروجی فرستاده میشه.در غیر این صورت 0به خروجی فرستاده میشه......البته همینطور که someone گفتند بهتره از عملگر شیفت(در این برنامه شیفت به راست) استفاده بشه چون سرعت بیشتری نسبت به عمل ضرب و تقسیم داره.در واقع بهتره به جای i=i/2 بنویسیم i >>1 =i
vBulletin , Copyright ©2000-2025, Jelsoft Enterprises Ltd.