আপনি আপনার পিতৃভূমির সাথে যোগাযোগের চেষ্টা করছেন এমন একটি গোপন এজেন্ট। অবশ্যই তথ্যগুলি লুকিয়ে রাখা দরকার যাতে আপনার বার্তাটি কেউই ফেলে না। একটি বিড়াল চেয়ে ভাল উপযুক্ত কি হতে পারে? প্রত্যেকে বিড়ালের মজার ছবি পছন্দ করে [উদ্ধৃতি আবশ্যক] , সুতরাং তারা সেখানে গোপন তথ্য লুকিয়ে রাখার সন্দেহ করবে না!
অ্যালগরিদম দ্বারা অনুপ্রাণিত গেমটি মোনাকো ভাগ করা স্তরের স্তরের তথ্য সংরক্ষণ করতে ব্যবহার করে এমন একটি প্রোগ্রাম লিখতে আপনার কাজ যা কোনও চিত্রের রঙের নূন্যতম গুরুত্বপূর্ণ বিটটিতে তথ্য এনকোড করে থাকে write
এনকোডিং বিন্যাস:
- প্রথম 24 বিট অবশিষ্ট এনকোড বাইট-স্ট্রিং এর দৈর্ঘ্য নির্ধারণ বিট
- চিত্রটি বাম থেকে ডানে এবং উপরে থেকে নীচে পর্যন্ত পড়া হয়, স্পষ্টতই উপরের বাম পিক্সেল থেকে শুরু হয়
- চ্যানেলগুলি লাল থেকে সবুজ থেকে নীল পর্যন্ত পড়া হয়
- প্রতিটি চ্যানেলের সর্বনিম্ন উল্লেখযোগ্য বিটটি পড়া হয়
- বিটগুলি বিগ এন্ডিয়ান ক্রমে সংরক্ষণ করা হয়
নিয়মাবলী:
- আপনার প্রোগ্রামটি এনকোড করতে একটি একক বাইট-স্ট্রিং এবং বেস চিত্রের জন্য একটি একক চিত্র ফাইলের নাম নেয়
- ফলস্বরূপ চিত্রটি অবশ্যই সত্য রঙের পিএনজি ফাইল হিসাবে প্রকাশিত হওয়া উচিত
- আপনি নিজের প্রোগ্রামটি কীভাবে ব্যবহার করবেন সে সম্পর্কে যতক্ষণ না বলছেন ততক্ষণ আপনি আপনার পছন্দ মতো (এআরজিভি, এসটিডিএন, এসটিডিআউট, একটি ফাইল থেকে লেখার / পড়ার) আই / ও ব্যবহার করতে পারেন
- আপনার প্রোগ্রামটি কাজ করে তা দেখানোর জন্য আপনাকে অবশ্যই একটি মজাদার বিড়ালের একটি এলোমেলো চিত্র চয়ন করতে হবে এবং এতে আপনার প্রোগ্রামটিকে এনকোড করতে হবে
- আপনি ধরে নিতে পারেন যে আপনি কেবল বৈধ ইনপুট সরবরাহ করেছেন, যদি বিটের পরিমাণ যথেষ্ট না হয় তবে চিত্রটি সত্য রঙের ফর্ম্যাটে না থাকে, চিত্রটির অস্তিত্ব থাকে না বা অনুরূপ সমস্যাগুলি যা আপনি চান তা করতে পারেন
- আপনি ধরে নিতে পারেন যে সরবরাহিত চিত্রটিতে কোনও আলফা চ্যানেল নেই
- দৈর্ঘ্য বিওএম ছাড়াই ইউটিএফ -8 বাইটে গণনা করা হয়
আপনি নিজের সমাধানটি পরীক্ষা করতে এই পিএইচপি স্ক্রিপ্টটি ব্যবহার করতে পারেন, প্রথম কমান্ড লাইন আর্গুমেন্ট হিসাবে পিএনজি ফাইলের নাম সরবরাহ করুন:
<?php
if ($argc === 1) die('Provide the filename of the PNG to read from');
$imageSize = @getimagesize($argv[1]);
if ($imageSize === false) die('Not a PNG file');
list($width, $height) = $imageSize;
$image = imagecreatefrompng($argv[1]);
$read = 0;
$bits = '';
for ($y = 0; $y < $height; $y++) {
for ($x = 0; $x < $width; $x++) {
$colorAt = imagecolorat($image, $x, $y);
$red = ($colorAt >> 16) & 0xFF;
$green = ($colorAt >> 8) & 0xFF;
$blue = ($colorAt >> 0) & 0xFF;
$bits .= ($red & 1).($green & 1).($blue & 1);
$read += 3;
if ($read == 24) {
$length = (int) bindec($bits);
$bits = '';
}
else if ($read > 24 && ($read - 24) > $length) {
$bits = substr($bits, 0, $length);
break 2;
}
}
}
if (strlen($bits) !== $length) die('Not enough bits read to fulfill the length');
$parts = str_split($bits, 8);
foreach ($parts as $part) {
echo chr(bindec($part));
}