কোনও ফাইলের কাঁচা বাইট লেখার কি কোনও বিপদ আছে? [বন্ধ]


12

আমি প্রোগ্রামিং পার্লস - বিশেষত, একটি প্রোগ্রাম যা বেশিরভাগে 10,000,000 পূর্ণসংখ্যার (একটি কলাম 1, সমস্যা 3) সমেত একটি ফাইল সাজায় এমন একটি প্রোগ্রাম বাস্তবায়ন করার ক্ষেত্রে একটি সমস্যার মধ্য দিয়ে কাজ করছি। যেহেতু বইটি ফাইলটিতে কীভাবে ডেটা সংরক্ষণ করা উচিত তা নির্দিষ্ট করে দেয় না, তাই আমি পূর্ণসংখ্যাগুলি কাঁচা বাইট হিসাবে সংরক্ষণ করার বিষয়টি বিবেচনা করছি (কিছু অন্যান্য বাধা রয়েছে যা কাঁচা বাইটকে একটি ভাল বিকল্প হিসাবে তৈরি করে)। আমি এর আগে কখনও এই স্তরের নিচে কাজ করি নি, তাই আমি জানতে চাই যে বিপজ্জনক কিছু আছে যা আমার সন্ধান করা উচিত if উদাহরণস্বরূপ, যখন আমি কোনও ফাইলে কাঁচা বাইট লিখছি তখন ঘটনাক্রমে ফাইল-এর ক্রম কিছু প্রকারের প্রসঙ্গে দুর্ঘটনাক্রমে উদ্বেগ প্রকাশ করার দরকার আছে?

সম্পাদনা:

আমি বুঝতে পারি আমার প্রশ্নটি কতটা বিস্তৃত ছিল। আমি ঘটনাক্রমে ডিস্কের অন্যান্য ফাইলগুলিকে ওভাররাইট করার মতো আরও বিপর্যয়কর ধরণের সমস্যা বলতে চাইছিলাম। দুঃখিত আমি মূলত পরিষ্কার ছিলাম না।


6
নোট করুন যে প্রোগ্রামিং পার্লস একটি খুব পুরানো বই; আপনি কোনও আধুনিক ডেস্কটপ মেশিনে পুরো 10 ^ 7 পূর্ণসংখ্যাকে সহজেই মেমোরিতে পড়তে পারেন, বাছাই করে তা আবার লিখতে পারেন। এই অধ্যায়ের মূল পয়েন্টটি পেতে, আপনি যে কোনও সময় মোট পরিমাণের ভগ্নাংশের মধ্যে সীমাবদ্ধ করুন। অথবা, প্রায় 10 around 10 পূর্ণসংখ্যায় ফাইলের আকার বাড়ান।
কালেব

3
আসলে, যখন আমি "বিপজ্জনক" শব্দটি শুনি, তখন আমি এমন জিনিসগুলির কথা চিন্তা করি যা আমার পিসি বিস্ফোরিত করে, আমার ব্যাংক অ্যাকাউন্টগুলি বা এই জাতীয় কিছু মুছতে পারে। এবং আমি অনুমান করি যে এটি সম্ভবত নিরাপদ হিসাবে ধরে নেওয়া যায় - যতক্ষণ না আপনার প্রোগ্রামটি এয়ারবাস বা বিদ্যুৎ কেন্দ্র নিয়ন্ত্রণের জন্য ব্যবহৃত না হয় - আপনি যা মনে রাখবেন তা চেষ্টা করার পরে সত্যই "বিপজ্জনক" কিছুই ঘটবে না।
ডক ব্রাউন


2
@ ডেলানান বছর আগে, যখন ইওএফ চরিত্রটির রূপকথার প্রচলন ছিল, তখন আমি সেই কপি সুরক্ষা সিস্টেমগুলি স্মরণ করি যা সেই সময়ের অনেক অনুলিপি প্রোগ্রামগুলি করে 'ইওএফ চরিত্রের অনুলিপি' ভিত্তিক ছিল। কিছু প্রোগ্রাম অতিরিক্ত ডেটা রাখে যা তারা সম্পর্কিত টেক্সট ফাইলের ইওফ চিহ্নিতকারী পরে ফাইলের বরাদ্দ শেষ হওয়ার আগে যাচাই করবে । অনুলিপি প্রোগ্রামটি একটি ক্লিন ইনস্টল যাচাই করা অতিরিক্ত ডেটা অনুলিপি করবে না ... আহ ... নস্টালজিয়া।

বিপদ? "যদি আমি এটি করি তবে কি আমার কম্পিউটারটি ফুরিয়ে যাবে"? নাঃ।
জ্বলছে

উত্তর:


11

আপনি কেবলমাত্র বিপদের মধ্যে যে বিপদটি চালিয়ে যাবেন তা হ'ল সামান্য বনাম বড় অন্তর্নিহিতা (সর্বাধিক বা কমপক্ষে উল্লেখযোগ্য বাইটটি প্রথমে লেখা আছে কিনা)। তবে আপনি যদি একই পরিবেশে থেকে যান তবে কোনও সমস্যা হবে না। রাউন্ডট্রিপ লেখার / পার্সিংয়ের সাধারণ নিশ্চিতকরণের পাশাপাশি।

ফাইল সিস্টেমটি বাইটগুলির যে কোনও ক্রম পরিচালনা করার জন্য ডিজাইন করা হয়েছে।


2
শেষ লাইনের জন্য +1। আমি নিশ্চিত না যে বড় / ছোট সমস্যাটিই একমাত্র সমস্যা - ওপি উদাহরণস্বরূপ পূর্ণসংখ্যার মধ্যবর্তী সীমানা কোথায় তা নিয়ে বিভ্রান্ত হতে পারে। তবে যাইহোক ভাল উত্তর।
কালেব

27

না, বাস্তবে এটি কতগুলি ফাইল ফর্ম্যাট কাজ করে। বাইনারি ফাইলগুলির সাধারণ উদাহরণগুলির মধ্যে চিত্র এবং সংগীত / অডিও ফাইল অন্তর্ভুক্ত রয়েছে।

ফাইলটির অখণ্ডতা এবং এটি থেকে পড়া ডেটা রক্ষা করতে, এই নির্দেশিকাগুলি অনুসরণ করতে ভুলবেন না:

  • সর্বদা একই মোড: পাঠ্য বা বাইনারি ব্যবহার করে ফাইল (পড়া বা লেখা) খুলুন। প্রাথমিক পার্থক্যটি হ'ল পাঠ্য মোডটি নতুন লাইনের বিষয়ে চিন্তা করে এবং কোনও ফাইল পড়ার সময় নতুন লাইনের অক্ষরগুলি "ছম্প" করতে পারে (নির্দিষ্ট লাইব্রেরি ব্যবহৃত হচ্ছে তার উপর নির্ভর করে)। পাঠ্য মোডে ইউনিকোড অনুবাদগুলিও সম্পাদন করতে পারে যা সম্ভবত ইউনিকোড নন-এর উপর চোক চাপিয়ে দেবে।
  • নন-স্ট্রিং ডেটা পড়ার সময়, আপনি যেমন লেখেন তেমন ডেটা টাইপ ব্যবহার করে পড়তে ভুলবেন না। উদাহরণস্বরূপ, যদি ফাইলের প্রথম চারটি বাইট বর্ণনামূলক পূর্ণসংখ্যার হয় তবে এটি একটি ধারাবাহিকভাবে চিকিত্সা করা হয় তা নিশ্চিত করার জন্য একটি পূর্ণসংখ্যার গ্রহণ / সরবরাহ করে এমন একটি পদ্ধতি ব্যবহার করে পড়তে এবং লিখতে ভুলবেন না। একই মেশিনের ধরণটি বিভিন্ন মেশিনে ভিন্ন আকারের হতে পারে এবং একই মেশিনে ডেটা ধরণের মিশ্রণের ফলেও ডেটার অর্থ পরিবর্তন হতে পারে (উদাহরণস্বরূপ দীর্ঘতম পূর্ণসংখ্যার মাঝখানে কিছুটা ব্যাখ্যার চিহ্ন হিসাবে) as
  • পরিণতি: আপনি যে লাইব্রেরিটি ব্যবহার করছেন এটি যদি ধারাবাহিকভাবে পরিচালনা না করে তবে আপনার নিজেরাই এটি হ্যান্ডেল করার প্রয়োজন হতে পারে। উদাহরণস্বরূপ, জাভা সর্বদা মাল্টি-বাইট প্রকারের জন্য নেটওয়ার্ক বাইট অর্ডার (বড় এন্ডিয়ান) ব্যবহার করে। সি এবং সি ++ লাইব্রেরি প্রয়োগকারীরা যা সিদ্ধান্ত নিয়েছে তা ব্যবহার করুন, সাধারণত প্রসেসরের মতোই (ইন্টেলের উপর ছোট এন্ডিয়ান, বেশিরভাগের ক্ষেত্রে বড় এন্ডিয়ান)। যদি এটি একটি সিস্টেমে দ্রুত অনুশীলন হয় তবে এটি তাত্পর্যপূর্ণ নয়, তবে এটির দিকে মনোযোগ দেওয়া এবং প্রয়োজনীয় প্রয়োজনে তার চারপাশে কোড করা এখনও একটি ভাল অভ্যাস।

নির্দিষ্ট বিবরণ কাঠামো, প্ল্যাটফর্ম এবং ভাষার উপর ভিত্তি করে পরিবর্তিত হতে পারে, তবে এটি আই / ও ফাইলের সাথে বেসিক "গটচগুলি" আবরণ করবে।


3
নন-স্ট্রিং ডেটার জন্য অতিরিক্ত পয়েন্ট: নিশ্চিত করুন যে আপনি প্রতিটি ধরণের জন্য ধারাবাহিক সংখ্যক বাইট ব্যবহার করছেন। সি এবং সি ++ এ int2 এবং 8 বা তার বেশি বাইটের (অক্টেটস সত্যই) এর মধ্যে যে কোনও জায়গায় থাকতে পারে।
বার্ট ভ্যান ইনজেন শেেনা

এটি আমার দ্বিতীয় পয়েন্টের সাথে স্পষ্টভাবে অন্তর্ভুক্ত করা হয়েছে, যেমন 32 ভি। 64 বিট পূর্ণসংখ্যা ger তারা বিভিন্ন তথ্য ধরণের হবে।

আপনি এটি সুস্পষ্ট করতে চাইবেন। এটি স্পষ্ট নয় যে intদুটি ভিন্ন মেশিনে আলাদা আলাদা ডেটাটাইপ হিসাবে বিবেচিত হতে পারে।
বার্ট ভ্যান ইনজেন শেহেনো

9

ইতিমধ্যে উল্লিখিত সমস্ত গেটচা ছাড়াও, আপনি যদি কোনও বিদ্যমান বিন্যাসে ডেটা পড়ার ও লেখার পরিবর্তে কোনও নতুন বাইনারি ফাইল ফর্ম্যাট তৈরি করে থাকেন তবে ফাইল ফাইল শিরোনাম অন্তর্ভুক্ত করা একেবারে জরুরী: একেবারে শুরুতে ডেটা একটি ব্লক ফাইলটি যা দ্ব্যর্থহীনভাবে ফাইল ফর্ম্যাটটি সনাক্ত করে এবং প্রয়োজনীয় কোনও মেটাডেটা রেকর্ড করে।

ভাল ফাইল শিরোনামে কমপক্ষে তিনটি জিনিস অন্তর্ভুক্ত থাকে:

  • কমপক্ষে চার বাইটের একটি " ম্যাজিক নম্বর "। ফাইলটির জাদু নম্বরটি অবশ্যই rfc2119 হ'ল প্রথম এন বাইট হতে হবে , আপনি যে কোনও ফাইল ফর্ম্যাট খনন করতে পারবেন তার জন্য কখনও ব্যবহার করা হয়নি, এবং কমপক্ষে একটি বাইট থাকা আবশ্যক যা মুদ্রণযোগ্য ASCII অক্ষর নয়। কীভাবে সত্যিই পুঙ্খানুপুঙ্খভাবে যাদু নম্বর ডিজাইন করা যায় তার জন্য পিএনজি স্পেসিফিকেশন দেখুন । বিদ্যমান যাদু সংখ্যার একটি ডাটাবেসের জন্য কমান্ডের উত্স কোডটি দেখুন যা আপনি সম্ভবত খুঁজে পেতে পারেন comprehensivefile(1)

    যাদু সংখ্যার বিন্দুটি হ'ল বিন্যাসহীনভাবে ফাইলটিকে ইন-ব্যান্ড, তার বিন্যাস সহ লেবেল করা। আপনি যদি কোনও ম্যাজিক নম্বর অন্তর্ভুক্ত না করেন বা ফাইলটিতে এটি প্রথম জিনিস নয় তবে আপনি আপনার ফাইলটিকে অন্য কোনও ধরণের ফাইল হিসাবে ভুল সনাক্তকরণের ঝুঁকি চালান যা ডেটা হ্রাস, ভাইরাস সনাক্তকরণের হাত থেকে বাঁচতে পারে এবং এই জাতীয় অন্যান্য বিপর্যয়।

  • ফাইল ফর্ম্যাটটির সংস্করণটির ইঙ্গিত । এমনকি আপনি যদি মনে করেন যে আপনার কখনোই আয়তন বহুলাংশে আপনার ফাইল ফরম্যাট সংশোধন করার, ম্যাজিক নম্বর পর পরবর্তী দুই বাইট হতে করতে আছে চলুন 00 00এবং নথি যে এই কিছু নির্দিষ্ট endianness একটি 16 বিট সংস্করণ নম্বর (যেটা আপনি পছন্দ করেন, কিন্তু বাছাই এক এবং পুরো ফাইল জুড়ে এটি আটকে থাকুন ) এবং যদি পরবর্তী তথ্যের অর্থ আমূল পরিবর্তন হয় তবে বাড়ানো হবে। আপনার ভবিষ্যত স্ব আপনাকে ধন্যবাদ জানাতে হবে।

    (পিএনজি স্পেসিফিকেশনটি এখানে আলাদা একটি রুট নিয়েছে, উল্লেখ করে যে বিশিষ্ট ফর্ম্যাটগুলি হিমায়িত হয়েছে এবং ভবিষ্যতে ফরম্যাটে সমস্ত পরিবর্তন নতুন খণ্ড ধরণের আকারে নেবে That's এটি বৈধ, তবে আমি সাধারণ ম্যাজিক নম্বর + সংস্করণ নম্বর পদ্ধতির জন্য সুপারিশ করি) বাইনারি ডেটা প্রসেসিংয়ের সূচনা। PNG ডিজাইন করা লোকেরা চিত্রের ফর্ম্যাটগুলির সাথে সম্মিলিত দশকের অভিজ্ঞতা আঁকছিলেন were)

  • ফাইলে স্বেচ্ছাচারিত মেটাডেটা এম্বেড করার জন্য এক ধরণের প্রক্রিয়া । এটি পরবর্তী দুটি বাইট হোল্ডারের শেষে থেকে আসল ডেটার শুরু পর্যন্ত একটি 16-বিট অফসেটের মতো সহজ হতে পারে , যার মধ্যে সমস্ত কিছুকে ইউটিএফ -8 কী-মান জোড় হিসাবে একটি লা আরএফসি 822 হিসাবে ব্যাখ্যা করা যায় (এটি, " Tag: value\n" - আপনি যদি এই পথে যান তবে আমি দীর্ঘ লাইন ভাঁজ করার অনুমতি না দেওয়ার প্রস্তাব দিই )। আবার, পিএনজি যথেষ্ট চালাক।


আপনার নিজের ফাইল ফর্ম্যাটটি তৈরি করার দরকার নেই ... কেবল একটি চিত্র হিসাবে ডেটা সঞ্চয় করুন। আপনার ডাইমেনিয়ালিটি পরিবর্তন করার দরকার হতে পারে (যেমন, 10 কে x 1 ক) তাই এটি সমর্থিত হবে। অথবা আপনি কি ব্যবহার করতে পারে ফিট । যদি আপনার ডেটা কেবল একটি একক অ্যারের চেয়ে জটিল হয় তবে আপনি এইচডিএফ , সিডিএফ বা নেটসিডিএফ ব্যবহার করতে পারেন ।
জো

আমি এটি সহজ রাখার পরামর্শ দিই। 256 বিভিন্ন সংস্করণ যথেষ্ট হবে এবং যদি তা না হয় তবে অতিরিক্ত সংস্করণগুলি 255 সংস্করণের সাবভারশন হিসাবে রূপান্তর করা যেতে পারে Similarly একইভাবে মেটাডেটার জন্য, যখন তাদের প্রকৃত প্রয়োজন হয় তখন কোনও সংস্করণে এগুলি যুক্ত করা যথেষ্ট। @ জো ইমেজ ??? আপনি সবার আগেই বিভ্রান্ত করে সম্ভাব্য বিন্যাসের বিভ্রান্তি এড়িয়ে চলেছেন!
মার্টিনাস

@ মাআর্টিনাস দুটি বাইট সংস্করণ ক্ষেত্র তৈরি করা বিন্যাস ডিজাইনারকে সামনের দিকে শেষ করতে বাধ্য করে। মেটাডেটার স্থান সর্বদা বাইনারি বিন্যাসের 0 সংস্করণে হওয়া উচিত, অন্যথায় আপনি আইডি 3 এর মতো ভয়াবহ ক্লাদেজ দিয়ে সজ্জিত হন। বিন্যাসের সংস্করণ নাড়ার পরিবর্তে নতুন অংশগুলির মাধ্যমে এক্সটেনসিবিলিটি সম্পর্কিত পিএনজি স্পেকের যুক্তির প্রতি আমার অনেক সহানুভূতি রয়েছে। তবে খণ্ড-কাঠামোগত ফাইলগুলি তাদের নিজস্ব জটিলতার একটি গোছা নিয়ে আসে তাই আমি সাধারণ ক্ষেত্রে তাদের সুপারিশ করতে সংকোচ করি hes আমি এইচডিএফকে জেনেরিক ফর্ম্যাট হিসাবে সুপারিশ করতে প্ররোচিত হয়েছিল যা ইতিমধ্যে এর মধ্যে প্রচুর সমস্যার সমাধান হয়েছে।
zwol

2

পূর্ণসংখ্যার জন্য বিভিন্ন স্থাপত্যের বিভিন্ন উপস্থাপনা থাকে represent এখানে মূল ঝুঁকি মেশিন একটি একটি পূর্ণসংখ্যা বাইট প্রতিনিধিত্ব সংরক্ষণ করা হয় এবং তারপর যে ফিরে পড়া প্রয়াস এবং পূর্ণসংখ্যার যেমন বিষয়বস্তু ব্যাখ্যা মেশিন বি মধ্যে মেশিন A এবং B পূর্ণসংখ্যার জন্য এবং / অথবা বিভিন্ন বিভিন্ন আকারের যদি endianness , আপনি ' সম্ভবত সম্ভবত অপরিবর্তিত আচরণের কারণ হবে (যেমন সি তে) বা একটি ব্যতিক্রম।

যেহেতু এটি কেবল একটি প্রোগ্রামিং উদাহরণ এবং "বাস্তব" প্রোগ্রাম নয়, এটি আসলে কোনও সমস্যা নয়। যদি এটি একটি আসল প্রোগ্রাম হয় তবে আপনার নিজের অ্যাপ্লিকেশন-নির্দিষ্ট বাইনারি ফর্ম্যাটটি ঘূর্ণন করা সাধারণত ভাল ধারণা নয়; আরও ভাল সমাধান রয়েছে যেমন এসকিউএলাইট বা স্ট্রিং-ভিত্তিক সিরিয়ালাইজেশন ফর্ম্যাটগুলির মতো জেএসওএন, ওয়াইএএমএল, এক্সএমএল ইত্যাদি single সাধারণ তালিকাগুলির জন্য আপনি প্রতি লাইনে একটি স্ট্রিং সংরক্ষণ করতে পারেন এবং ইনপুটটিকে নতুন পাঠানোর সময় সহজেই বিভক্ত করতে পারেন।


সাধারণভাবে সম্মত হন, তবে জেএসএন বা এক্সএমএল 10 ^ 7 নম্বরযুক্ত ফাইলের আকারকে উল্লেখযোগ্যভাবে বাড়িয়ে তুলবে। এছাড়াও, তারা সাধারণত একবারে একবারে পড়তে এবং পার্স করা হয়, তবে প্রশ্নের অধ্যায়টি আপনার উপলব্ধ স্মৃতিতে ফিট করার চেয়ে আরও বেশি ডেটাযুক্ত ফাইল বাছাইয়ের বিষয়ে আলোচনা করে।
কালেব

এটি আপনি কী করছেন তার উপর নির্ভর করে। কখনও কখনও এসকিউএল বনাম আপনার নিজস্ব রোলের পারফরম্যান্স হিট হয়। সর্বশেষে যখন আমি এটি করেছি তখন আমার কাছে ছোট রেকর্ড ছিল এবং আমার প্রতিবেশী হওয়ার উচ্চ সম্ভাবনা ছিল। ডিস্কের বাইরে বড় ব্লক পড়তে সাধারণত প্রায় কিছুই খরচ হয় না তাই যদি আমি একটি রেকর্ড চাইতাম তবে আমি ক্যাশে 1000 পড়ি। আমার রেকর্ডগুলি প্রায় অবশ্যই একে অপরের পাশে ছিল, এসকিউএল দিয়ে ডিস্ক হেডটি পুরো জায়গা জুড়ে বাউন্স করবে।
লরেন পেচটেল
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.