>> [عزف الموسيقى]
>> ZAMYLA تشان: كان ملكة جمال سكارليت مع الشمعدان.
المجرم؟
أيضا، ونحن في طريقنا لمعرفة ذلك.
في لعبة متنها فكرة، كنت قد أن تعطى صورة حمراء المادية.
وتلك الصورة هو أحمر جدا و متقطعا، وعملك هو ل
تكشف الرسالة المخفية.
وعادة ما كنت قدمت مع أحمر العدسة المكبرة، أو شاشة حمراء ل
تكشف تلك الرسالة الخفية.
حسنا، نحن ذاهبون لتقليد ذلك.
>> في المجرم، كنت تعطى صورة نقطية الذي يبدو متقطعا جدا والأحمر،
ثم قم بتشغيل البرنامج المجرم لتكشف عن وجود رسالة خفية.
>> لذلك دعونا كسر هذه إلى خطوات.
أولا، تريد فتح الملف - على فكرة أن كنت قد أعطيت.
ثم أيضا إنشاء ملف الحكم نقطية.
ثم كنت تريد تحديث نقطية رأس معلومات عن OUTFILE الحكم.
المزيد عن ذلك لاحقا.
ثم كنت تريد الذهاب لقراءة في فكرة، scanline لل، بكسل بكسل،
تغيير الألوان بكسل كما اللازمة، والكتابة
وتلك في الحكم -
بكسل بكسل في الحكم scanline لل.
>> كيف نبدأ ذاهب حول هذا الموضوع؟
حسنا، لحسن الحظ، لدينا copy.c في كود التوزيع.
وهذا سوف يثبت مفيدة للغاية بالنسبة لنا.
Copy.c يفتح الملف، يقرأ في ذلك رأس INFILE، ثم بتحديث
رأس OUTFILE ل.
وبعد ذلك يقرأ كل بكسل في scanline لل، بكسل بكسل، ثم
ان يكتب بكسل في OUTFILE.
>> لذلك، قد الخطوة الأولى يكون لتشغيل التالية
الأمر في محطة -
حزب المحافظين copy.c whodunit.c.
هذا سيخلق نسخة من copy.c اسمه whodunit.c.
لذلك أول خطوة نخطوها لفتح ملف، حسنا، هناك بالضبط
طبق الأصل من أنه في copy.c.
لذلك سأترك لك أن ننظر في ذلك.
>> ما نتعامل مع هذا في PSET و ملف I / O، مع الأخذ في الأساس الملفات،
القراءة والكتابة وتحريرها.
كيف عليك أولا فتح ملف؟
كذلك، وأنت تسير لتعلن ملف المؤشر، ومن ثم استدعاء
وظيفة الدالة fopen.
تمر في المسار، أو اسم ذلك ملف، ثم الوضع الذي تريد
لفتح هذا الملف فيه.
سوف تمر في ص فتح foo.bmp للقراءة.
بينما الدالة fopen مع مرور في ث سوف bar.bmp مفتوحة، لكتابة الملف و
تحرير فعلا.
>> وحتى الآن بعد أن قمنا فتح الملف، لدينا الخطوة التالية هي لتحديث معلومات رأس
لOUTFILE.
ما هو معلومات رأس؟
حسنا، أولا نحن بحاجة إلى معرفة ما هو صورة نقطية.
صورة نقطية هو مجرد بسيطة ترتيب بايت.
وانهم أعلن في هذا الملف هنا، bmp.h، مع حفنة من
المعلومات ما نقطية يرصد الواقع من.
ولكن ما يهمنا حقا هو عن رأس ملف الصورة النقطية، والحق هنا، و
المعلومات رأس نقطية، أكثر من هنا.
يتكون رأس اثنين من المتغيرات التي من شأنها أن تكون مفيدة جدا.
هناك biSizeImage، والذي هو الحجم الكلي للصورة في بايت.
وهذا يشمل بكسل والحشو.
الحشو مهم جدا، ولكن سوف نصل الى ذلك لاحقا.
>> BiWidth يمثل عرض الصورة بالبكسل ناقص الحشو.
BiHeight ومن ثم أيضا ارتفاع الصورة بالبكسل.
ثم BITMAPFILEHEADER و BITMAPINFOHEADER، وكما ذكرت
في وقت سابق، وتتمثل تلك كما البنيات.
لذلك، لا يمكن الوصول إلى رأس ملف في حد ذاته، ولكن عليك أن ترغب في الحصول على
تلك المتغيرات في الداخل.
>> موافق.
لذلك كيف نقوم بتحديث معلومات رأس؟
كذلك، علينا أولا أن نرى ما إذا كنا بحاجة إلى تغيير أي من المعلومات
وINFILE، وفكرة، ل OUTFILE، والحكم.
يتم تغيير أي شيء في هذه الحالة؟
حسنا، ليس في الواقع، لأننا ذاهبون أن مجرد تغيير الألوان.
نحن لن تغيير الملف الحجم، حجم الصورة، والعرض،
أو الارتفاع.
لذلك كنت كل الحق في الوقت الراهن من قبل مجرد نسخ كل بكسل.
>> موافق.
حتى الآن دعونا ننظر في كيفية ونحن في الواقع يمكن قراءة كل بكسل من الملف.
ملف آخر أنا يا وظيفة / وسوف تدخل حيز اللعب -
fread.
فإنه يأخذ في مؤشر إلى البنية التي سوف تحتوي على وحدات البايت التي
كنت تقرأ.
لذلك كنت تقرأ في ذلك.
وبعد ذلك تمر في الحجم، والتي هي حجم كل عنصر التي قمت
تريد أن تقرأ.
هنا، وظيفة sizeof سوف تأتي في متناول اليدين.
ثم قمت بتمرير في العدد، والتي يمثل عدد عناصر
حجم القراءة.
ثم أخيرا، inptr، الذي هو مؤشر الملف الذي كنت
الذهاب الى قراءة من.
لذلك كل من هذه العناصر في الداخل inptr وانهم ذاهبون الى البيانات.
>> دعونا ننظر في مثال قليلا.
إذا كنت ترغب في قراءة البيانات في اثنين من الكلاب، حسنا، أستطيع أن أفعل ذلك واحدة من طريقتين.
أستطيع أن أقرأ سواء في كائنين من حجم كلب من وجهة نظري inptr، أو أستطيع أن أقرأ
في واحد يعترض حجم اثنين من الكلاب.
لذلك ترى أن هذا يتوقف على الطريقة أن تقوم بترتيب حجم والعدد، كنت
يمكن أن نقرأ في نفس العدد من بايت.
>> وحتى الآن، دعونا تغيير بكسل اللون كما أننا بحاجة.
إذا نظرتم bmp.h مرة أخرى، ثم سترى أن في الجزء السفلي
RGBTRIPLEs هي البنية آخر، حيث وتتألف من ثلاثة هم بايت.
واحد، rgbtBlue، rgbtGreen، وrgbtRed.
لذلك كل من هذه يمثل المبلغ من اللون الأزرق، وكمية من اللون الأخضر، و
كمية أحمر داخل هذا بكسل، حيث يتم تمثيل كل المبلغ من قبل
رقم سداسي عشري.
>> حتى FF0000 سيكون اللون الأزرق، لأنه يذهب من الأزرق،
إلى اللون الأخضر، إلى اللون الأحمر.
وبعد ذلك كل و سوف تكون بيضاء.
دعونا نلقي نظرة على smiley.bmp، التي لديك في كود التوزيع.
إذا كنت فتحه في مجرد صورة المشاهد، ثم عليك
مجرد رؤية مبتسم الأحمر.
ولكن مع الأخذ الغوص أعمق في، وسوف نقوم نرى أن هيكل
من هو مجرد بكسل.
لدينا بكسل الأبيض، ثم بكسل الأحمر.
الأبيض، FFFFFF، وبعد ذلك كل من بكسل الحمراء لقد الملونة في لك
هنا، وترى أنهم 0000FF.
صفر الزرقاء، الصفر الأخضر، والأحمر الكامل.
ومنذ مبتسم ثمانية بكسل، ليس لدينا أي الحشو.
حسنا.
>> حتى إذا كان لي أن تعيين قيم مختلفة إلى RGBTRIPLE وأردت أن
جعله الخضراء، ثم ما يمكن أن تفعله هو وأود أن تعلن وRGBTRIPLE، واسمه
الثلاثي، ومن ثم الوصول إلى كل البايت داخل تلك البنية أنا
ستستخدم المشغل نقطة.
حتى triple.rgbtBlue، يمكنني تعيين هذا إلى 0.
الأخضر أستطيع أن إسناد ذلك إلى كامل - أي العدد، حقا، بين 0 و و و.
والأحمر ثم، انا ذاهب أيضا أن أقول 0.
حتى ذلك الحين أن يعطيني بكسل الخضراء.
>> المقبل، ما إذا كنت تريد أن تحقق قيمة شيء ما؟
أنا يمكن أن يكون شيئا يتحقق سواء قيمة rgbtBlue الثلاثي هو
وما يليها ثم الطباعة، "أشعر الزرقاء! "، نتيجة لذلك.
الآن، وهذا لا يعني بالضرورة إن بكسل باللون الأزرق، أليس كذلك؟
لأن القيم الأخضر والأحمر البيكسل يمكن أن يكون أيضا غير 0 القيم.
كل ما تعني هذه، وكل ما هذا هو التحقق عن
للون الأزرق الكامل.
ولكن كل بكسل يمكن أن يكون أيضا جزئية قيم الألوان، مثل هذا
المثال التالي هنا.
>> انها اصعب قليلا لنرى ما هو هذه الصورة الآن.
هذا يبدو قليلا أكثر مثل clue.bmp أن عليك أن تعطى.
الآن، جسديا، قد حل هذا، لأن هناك الكثير من الأحمر، من خلال
رافعين شاشة حمراء إلى الصورة حتى أن الألوان الأخرى يمكن أن تظهر.
لذلك كيف يمكننا تقليد هذا مع ج؟
كذلك، ونحن قد إزالة كافة الحمراء من الصورة تماما.
وذلك للقيام بذلك كنا تعيين كل قيمة بكسل الحمراء إلى 0.
وهكذا فإن الصورة تبدو قليلا قليلا من هذا القبيل، حيث ليس لدينا الأحمر
على الإطلاق.
>> يمكننا أن نرى رسالة خفية ل أكثر قليلا بشكل واضح الآن.
انها وجه مبتسم وجه آخر.
أو ربما يمكن أن نستخدم طريقة أخرى.
ربما، ونحن يمكن تحديد كل بكسل الأحمر -
وهذا هو، كل بكسل مع 0 الأزرق، 0 الأخضر والأحمر 0 -
وتغيير تلك إلى الأبيض.
وصورتنا قد تبدو شيء من هذا القبيل.
أسهل قليلا لنرى.
>> هناك الكثير من الطرق الأخرى للكشف عن الرسالة السرية أيضا،
التعامل مع التلاعب بالألوان.
ربما كنت قد تستخدم إحدى الطرق التي ذكرتها أعلاه.
وبالإضافة إلى ذلك، قد ترغب لتعزيز بعض الألوان
وتقديم المسؤولين للخروج.
>> وحتى الآن بعد أن قمنا بتغيير بكسل اللون، القادمة ونحن بحاجة فقط لكتابتها
في لscanline لل، بكسل بكسل.
ومرة أخرى، فأنت تريد أن ننظر إلى الوراء لcopy.c، إذا لم تكن قد نسخت
بالفعل، وإلقاء نظرة على fwrite وظيفة، والتي تأخذ البيانات، وهو مؤشر
إلى البنية التي تحتوي على بايت ان كنت تقرأ من، حجم
البنود، وعدد من العناصر، ثم outptr -
وجهة من تلك الملفات.
>> بعد أن تكتب في بكسل، عليك يجب أيضا أن الكتابة في الحشو.
ما هو الحشو؟
حسنا، كل بكسل rgbt ثلاثة بايت.
ولكن، وscanline للحصول على صورة نقطية يجب أن تكون متعددة من أربعة بايت.
وإذا كان عدد من وحدات البكسل ليس متعددة من أربعة، ثم نحن بحاجة إلى إضافة
هذا الحشو.
الحشو يتم تمثيل فقط عن طريق 0S.
لذلك، كيف نكتب، أو قراءة هذا؟
كذلك، اتضح أنه لا يمكن الحشو fread في الواقع، ولكن يمكنك
حساب ذلك.
>> في هذه الحالة، وفكرة الحكم لها نفس العرض، وبالتالي فإن
الحشو هو نفسه.
والحشو، كما سترى في copy.c، يتم حساب
مع الصيغة أدناه -
مرات bi.biWidth sizeof (RGBTRIPLE) سوف تعطينا عدد البايتات BMP
له في كل صف.
من هناك، وmodulos والطرح مع 4 كيف يمكن حساب
يجب إضافة العديد من بايت بحيث متعددة وحدات البايت على
كل صف أربعة.
>> الآن أن لدينا صيغة ل كم نحن بحاجة الحشو، والآن
يمكن أن نكتب عليه.
الآن، وأنا ذكرت من قبل، الحشو هو 0S فقط.
حتى في هذه الحالة، نحن مجرد وضع شار، في هذه الحالة 0 في موقعنا
outptr - OUTFILE لدينا.
بحيث يمكن أن يكون مجرد fputc 0، فاصلة outptr.
>> لذلك، في حين كنا في القراءة لدينا الملف، وأبقت ملف I / O المسار لدينا
الموقف في تلك الملفات مع شيء دعا مؤشر موقف الملف.
اعتقد انه ما من المؤشر.
في الأساس، فإنه يتقدم في كل مرة أننا fread، ولكن لدينا
السيطرة على أكثر من ذلك، أيضا.
>> لتحريك المؤشر الموقف الملف، يمكنك استخدام وظيفة fseek.
حيث يمثل inptr الملف المؤشر الذي كنت تسعى في و
المبلغ هو عدد البايتات التي تريد تحريك المؤشر، ومن ثم من
تتعلق النقطة المرجعية من حيث المؤشر الخاص بك هو.
إذا كنت تمر في SEEK_CUR، التي يمثل الحالي
موقف في الملف.
أو يمكنك استخدام بعض المعالم الأخرى.
لذلك، ونحن قد ترغب في استخدام fseek لتخطي على الحشو من الملف في.
ومرة أخرى، إذا كنت عالقا، وهناك مثال على ذلك في copy.c.
>> حتى الآن لقد فتح الملف، على فكرة، والحكم.
قمنا بتحديث معلومات رأس ل لدينا الحكم، لأن كل
نقطية يحتاج إلى رأس.
قمنا ثم قرأ في فكرة و scanline لل، بكسل بكسل، وتغيير
كل لون عند الضرورة، و الكتابة في تلك
الحكم بكسل بكسل.
بمجرد فتح الحكم، يمكنك معرفة من الذي الجاني، أو ما سر
الرسالة.
اسمي Zamyla، و كان هذا المجرم.