ইন্টারনেটে সিআরসি চেকসাম গণনা করার জন্য অনেকগুলি বিকল্প রয়েছে। তবে একটি চেকসাম আসলে কী এবং কেন এটি এইভাবে গণনা করা হয়? আসুন এটি বের করা যাক।
নির্দেশনা
ধাপ 1
প্রথমে কিছুটা তত্ত্ব নেওয়া যাক। তাহলে সিআরসি ঠিক কী? সংক্ষেপে, এটি চেকসাম গণনার বিভিন্ন ধরণের is যোগাযোগ চ্যানেলগুলির মাধ্যমে প্রেরণ করার সময় প্রেরণকারী পক্ষের প্রাপ্ত তথ্যের অখণ্ডতা যাচাই করার জন্য চেকসাম একটি পদ্ধতি। উদাহরণস্বরূপ, সবচেয়ে সহজ চেকগুলির মধ্যে একটি হল প্যারিটি বিট ব্যবহার করা। এটি যখন সঞ্চারিত বার্তার সমস্ত বিট যোগ করা হয় এবং যোগফলটি যদি সমান হয়ে যায় তবে বার্তাটির শেষে 0 যুক্ত করা হয়, যদি এটি বিজোড় হয়, তবে 1 প্রাপ্তির সময়, যোগফলের যোগফল বার্তা বিটগুলিও গণনা করা হয় এবং প্রাপ্ত প্যারিটি বিটের সাথে তুলনা করা হয়। যদি এগুলির মধ্যে পার্থক্য থাকে তবে সংক্রমণকালে ত্রুটি ঘটেছিল এবং সংক্রমণিত তথ্য বিকৃত করা হয়েছিল।
তবে ত্রুটির উপস্থিতি সনাক্ত করার এই পদ্ধতিটি অত্যন্ত তথ্যহীন এবং সবসময় কাজ করে না, কারণ বার্তার বেশ কয়েকটি বিট যদি বিকৃত হয় তবে যোগফলের সাম্য পরিবর্তন হতে পারে না। অতএব, সিআরসি সহ আরও অনেক "অ্যাডভান্সড" চেক রয়েছে।
প্রকৃতপক্ষে, সিআরসি কোনও যোগফল নয়, তবে স্থির দ্বারা নির্দিষ্ট পরিমাণ তথ্য (তথ্য বার্তা) ভাগ করার ফলস্বরূপ, বা একটি ধ্রুবক দ্বারা কোনও বার্তা ভাগ করার অবশিষ্ট অংশ। তবে সিআরসি historতিহাসিকভাবে একটি "চেকসাম" হিসাবেও পরিচিত। বার্তার প্রতিটি বিট সিআরসি মানটিতে অবদান রাখে। এটি হ'ল সংক্রমণের সময় যদি মূল বার্তার কমপক্ষে এক বিট পরিবর্তন হয় তবে চেকসামটিও পরিবর্তিত হবে এবং তা উল্লেখযোগ্যভাবে হবে। এটি এ জাতীয় একটি চেকের একটি বৃহত প্লাস, যেহেতু এটি আপনাকে নির্বিচারে নির্ধারণ করতে দেয় যে সঞ্চালনের সময় মূল বার্তাটি বিকৃত হয়েছিল কি না।
ধাপ ২
আমরা সিআরসি গণনা শুরু করার আগে, আরও কিছু তত্ত্বের প্রয়োজন।
মূল বার্তাটি কী তা পরিষ্কার হওয়া উচিত। এটি স্বেচ্ছাসেবী দৈর্ঘ্যের বিটের একটি সামঞ্জস্যপূর্ণ ক্রম।
ধ্রুবকটি কী যার মাধ্যমে আমাদের মূল বার্তাটি ভাগ করা উচিত? এই সংখ্যাটি কোনও দৈর্ঘ্যেরও, তবে সাধারণত 1 বাইটের গুণগুলি ব্যবহৃত হয় - 8, 16 এবং 32 বিট। এটি গণনা করা সহজ, কারণ কম্পিউটার বিট দিয়ে নয়, বাইট দিয়ে কাজ করে।
বিভাজক ধ্রুবক সাধারণত এইভাবে বহুপদী (বহুভুজ) হিসাবে লেখা হয়: x ^ 8 + x ^ 2 + x ^ 1 + x ^ 0। এখানে, "x" সংখ্যার ডিগ্রি মানে শূন্য থেকে শুরু করে সংখ্যায় এক বিটের অবস্থান এবং সর্বাধিক উল্লেখযোগ্য বিট বহুত্বের ডিগ্রি নির্দেশ করে এবং সংখ্যার ব্যাখ্যা দেওয়ার সময় বাতিল করা হয়। অর্থাৎ, পূর্বে লিখিত সংখ্যা বাইনারি (1) 00000111, বা দশমিক 7 এর বেশি কিছু নয়। প্রথম বন্ধনীতে, আমি সংখ্যার অন্তর্নিহিত সবচেয়ে উল্লেখযোগ্য সংখ্যা নির্দেশ করেছিলাম।
এখানে আরও একটি উদাহরণ রয়েছে: x ^ 16 + x ^ 15 + x ^ 2 + x ^ 0 = (1) 1000000000000101 = 0x8005 = 32773।
সাধারণত কিছু স্ট্যান্ডার্ড বহুভুজ বিভিন্ন ধরণের সিআরসি-র জন্য ব্যবহৃত হয়।
ধাপ 3
তাহলে আপনি চেকসাম কীভাবে গণনা করবেন? একটি মৌলিক পদ্ধতি রয়েছে - একটি বার্তাটিকে বহুবচন "হেড-অন" এর মধ্যে ভাগ করে নেওয়া - এবং গণনার সংখ্যা হ্রাস করার জন্য এবং এর পরিবর্তে সিআরসি গণনার গতি বাড়ান its আমরা বেসিক পদ্ধতিটি দেখব।
সাধারণত, একটি বহুভিত্তিক দ্বারা সংখ্যার বিভাজন নিম্নলিখিত অ্যালগরিদম অনুযায়ী সঞ্চালিত হয়:
1) একটি অ্যারে (রেজিস্টার) তৈরি করা হয়, শূন্যে ভরা, বহুতল প্রস্থের দৈর্ঘ্যের সমান;
2) মূল বার্তাটি বহুতোষের বিটের সংখ্যার সমান পরিমাণে কমপক্ষে উল্লেখযোগ্য বিটগুলিতে শূন্যের সাথে পরিপূরক হয়;
3) বার্তার একটি উল্লেখযোগ্য বিটটি নিবন্ধের সর্বনিম্ন উল্লেখযোগ্য বিটের মধ্যে প্রবেশ করা হয় এবং এক বিটটি নিবন্ধকের সবচেয়ে উল্লেখযোগ্য বিট থেকে সরানো হয়;
4) যদি বর্ধিত বিটটি "1" এর সমান হয়, তবে বিলিগুলি উল্টানো হয় (এক্সওর অপারেশন, এক্সক্লুসিভ ওআর) সেই রেজিস্টার বিটগুলিতে যেগুলি বহুবর্ষের সাথে সম্পর্কিত;
5) যদি বার্তায় এখনও বিট থাকে তবে 3 ধাপে যান);)) যখন বার্তার সমস্ত বিট নিবন্ধে প্রবেশ করে এবং এই অ্যালগরিদম দ্বারা প্রক্রিয়া করা হয়, বিভাগের বাকী অংশগুলি রেজিস্টারে থাকে, যা সিআরসি চেকসাম।
চিত্রটি মূল বিট ক্রমের বিভাজনকে (1) 00000111, বা বহুবর্ষীয় x ^ 8 + x ^ 2 + x ^ 1 + x ^ 0 দ্বারা চিত্রিত করে।
পদক্ষেপ 4
বেশ কয়েকটি অতিরিক্ত স্পর্শ বাকি আছে। আপনি যেমন খেয়াল করেছেন, মেসেজটি যে কোনও সংখ্যার দ্বারা ভাগ করা যায়। কীভাবে এটি নির্বাচন করবেন? সিআরসি গণনা করতে ব্যবহৃত হয় এমন অনেকগুলি স্ট্যান্ডার্ড পলিনোমিয়াল রয়েছে। উদাহরণস্বরূপ, সিআরসি 32 এর জন্য এটি 0x04C11DB7 হতে পারে এবং সিআরসি 16 এর জন্য এটি 0x8005 হতে পারে।
এছাড়াও, গণনার শুরুতে রেজিস্টারে আপনি শূন্য নয়, অন্য কোনও সংখ্যা লিখতে পারেন।
এছাড়াও, গণনার সময়, চূড়ান্ত সিআরসি চেকসাম জারির আগে, তাদের অন্য কোনও সংখ্যার দ্বারা ভাগ করা যায়।
এবং শেষ জিনিস। নিবন্ধটিতে লেখার সময় বার্তার বাইটগুলি সবচেয়ে উল্লেখযোগ্য বিট "ফরোয়ার্ড" এবং বিপরীতে, কমপক্ষে উল্লেখযোগ্য হিসাবে স্থাপন করা যেতে পারে।
পদক্ষেপ 5
উপরের সমস্তটির উপর ভিত্তি করে, আসুন একটি বেসিক. NET ফাংশন লিখি যা উপরে বর্ণিত বেশ কয়েকটি পরামিতি নিয়ে এবং সিআরসি মানটিকে 32-বিট স্বাক্ষরযুক্ত নম্বর হিসাবে ফিরিয়ে দিয়ে সিআরসি চেকসাম গণনা করে।
পাবলিক শেয়ারড ফাংশন গেটসিআরসি (বাইওয়াল বাইট হিসাবে বাইট (), বাইওয়াল পলি ইউআইএনটিজার হিসাবে, gerচ্ছিক বাইভাল প্রস্থ হিসাবে ইন্টিজার = 32, ptionচ্ছিক বাইভাল ইনরিগ হিসাবে ইউআইএনটিজার = এবং এইচএফএফএফএফএফএফএফআইআই, ptionচ্ছিক বাইভাল ফাইনালঅ্যাক্সর হিসাবে ইউএফটিএফএফএফআইএফআইএফএফআইপি, ওএফএফআইএফএফএফআইপি, ওফফাইএফআইএফএফআইপি রিভার্সসিআরসিআর বুুলিয়ান হিসাবে = সত্য) ইউআইএনটিগার হিসাবে
ধাপের প্রস্থInBytes হিসাবে পূর্ণসংখ্যা = প্রস্থ / 8
'শূন্যের সাথে বার্তার প্রস্থকে পরিপূরক করুন (বাইটে গণনা):
রিডিম সংরক্ষণ বাইটস (বাইটস। দৈর্ঘ্য - 1 + প্রস্থবিহীনবাইট)
'বার্তাটি থেকে কিছুটা সারি তৈরি করুন:
ধীরে ধীরে ইউপিউইনটি নতুন কাতারে (বুলিয়ান অফ) (বাইটস.একটি হিসাব * 8 - 1)
প্রতিটি খ হিসাবে বাইট ইন বাইট
ডিম বিম নিউ বিটআরে হিসাবে ({বি})
রিভার্সবাইটস তারপর
আমি পূর্ণসংখ্যার হিসাবে = 0 থেকে 7 For
msgFifo. Enqueue (বা (i))
পরবর্তী
অন্যথায়
আমি পূর্ণসংখ্যার হিসাবে = 7 থেকে 0 পদক্ষেপ -1
msgFifo. Enqueue (বা (i))
পরবর্তী
শেষ যদি
পরবর্তী
'নিবন্ধের প্রাথমিক ভরাট বিট থেকে একটি সারি তৈরি করুন:
বাইট () = বিটকনভার্টার.গেটবাইটস (initReg) হিসাবে ডিমবাইটস ডিমে
Dim initBytesReversed as IEnumerable (Of বাইট) = (বি বাইতে বাই বাইট ইন বাই বাইটস নিন প্রস্থইনবাইট)। বিপরীত
দিম ইনিফিফোটি নতুন কাতারে (বুলিয়ানের) হিসাবে (প্রস্থ - 1)
প্রতিটি বি বাইট ইন ইন বাই বাইটস রিভার্সড হিসাবে
ডিম বিম নিউ বিটআরে হিসাবে ({বি})
যদি রিভার্সবাইট না হয় তবে
আমি পূর্ণসংখ্যার হিসাবে = 0 থেকে 7 For
initFifo. Enqueue (বা (i))
পরবর্তী
অন্যথায়
আমি পূর্ণসংখ্যার হিসাবে = 7 থেকে 0 পদক্ষেপ -1
initFifo. Enqueue (বা (i))
পরবর্তী
শেষ যদি
পরবর্তী
'শিফট এবং এক্সওআর:
UInteger হিসাবে দিম নিবন্ধন করুন = 0 'শূন্যের সাথে প্রস্থ-বিট নিবন্ধটি পূরণ করুন।
যখন করবেন * ফিফো.কাউন্ট> 0
ধাপ পপপডবিট হিসাবে পূর্ণসংখ্যা হিসাবে = সিআইন্ট (নিবন্ধন করুন >> (প্রস্থ - 1)) এবং 1 'শিফট রেজিস্ট্রারের আগে সংজ্ঞায়িত করুন।
ডিমে শিফটবিট বাইট হিসাবে = কনভার্ট করুন টোবাইট (msgFifo. Dequeue)
যদি initFifo. Count> 0 তারপর
ডিমে বি বাইট হিসাবে = কনভার্ট করুন.টোবাইট (initFifo. Dequeue)
শিবিডবিট = স্থানান্তরিত বিড়াল খ
শেষ যদি
নিবন্ধ = রেজিস্টার << 1
রেজিস্টার = নিবন্ধন বা স্থানান্তরিত বিট
যদি পপডবিট = 1 তবে
রেজিস্টার = রেজিস্টার জোওর পলি
শেষ যদি
লুপ
'চূড়ান্ত রূপান্তর:
ডিআইএমসিআরসি হিসাবে ইউআইএনটিগার = রেজিস্টার 'রেজিস্টারটিতে বিভাগের বাকী অংশ == চেকসাম রয়েছে।
তাহলে রিভার্সসিআরসি
crc = প্রতিফলিত (crc, প্রস্থ)
শেষ যদি
crc = crc Xor ফাইনাল এক্সর
crc = crc এবং (এবং এইচএফএফএফএফএফএফএফএফইউআই >> (32 - প্রস্থ)) 'সর্বনিম্ন উল্লেখযোগ্য বিটগুলি মাস্ক করুন।
রিটার্ন
ফাংশন শেষ