এক্সএমএলে আপনি কীভাবে বাইনারি ডেটা এম্বেড করবেন?


107

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

আপডেট: আমি এপাচি কমন্স কোডেক লাইব্রেরি থেকে বেস 64 ক্লাসের সাথে এই কাজটি পেয়েছি , অন্য কেউ যদি এরকম কিছু চেষ্টা করে থাকে।

উত্তর:


216

আপনি বেস 64 ব্যবহার করে বাইনারি ডেটা এনকোড করতে এবং এটি একটি বেস 64 উপাদানটিতে রেখে দিতে পারেন; নীচের নিবন্ধটি বিষয়টিতে বেশ ভাল।

এক্সএমএল ডকুমেন্টসে বাইনারি ডেটা হ্যান্ডলিং করা


209

এক্সএমএল তাই বহুমুখী ...

<DATA>
  <BINARY>
    <BIT index="0">0</BIT>
    <BIT index="1">0</BIT>
    <BIT index="2">1</BIT>
    ...
    <BIT index="n">1</BIT>
  </BINARY>
</DATA>

এক্সএমএল হিংসার মতো - এটি যদি আপনার সমস্যার সমাধান না করে তবে আপনি এটি পর্যাপ্ত পরিমাণে ব্যবহার করছেন না।

সম্পাদনা করুন:

বিটিডাব্লু: বেস 64 + সিডিএটা সম্ভবত সেরা সমাধান

(সম্পাদনা 2:
যে কেউ আমাকে আপডমাস্ট করে, দয়া করে আসল উত্তরটিও আপডমোড করুন We আমরা চাই না যে কোনও দরিদ্র আত্মা এখানে আসুক এবং আসলে আমার পদ্ধতিটি বাস্তবায়ন করুক কারণ এটি এসও-তে সর্বোচ্চ র‌্যাঙ্ক ছিল, তাই না?)


9
এটি যদি আপনি গুরুতর হন তবে এটি এক্সএমএল এর সম্পূর্ণ অবজ্ঞাপূর্ণ ব্যবহারের চেয়ে কম নয়। এবং যদি আপনি না হন তবে উচ্চ-স্তরের-ভাবনা-নিম্ন-স্তরের লেখাগুলি না লেখকরা কীভাবে জানবেন?
TheFlash

1
আমি মনে করি এটি মজার। তবে হ্যাঁ, আবারও আসল বেস 64 dat ডেটাটাইপ ব্যবহার করার উপায়। সিডিটা খুব জেনেরিক।
ওমনিবম্বাত

4
আমার মনে হয় না এটি যথেষ্ট বর্ণনামূলক - সম্ভবত 'বিট' সংকোচনের পরিবর্তে কারও 'বিনারিডিজিট' ব্যবহার করা উচিত? ;-)
লি অ্যাটকিনসন

কি দারুন. এটি প্রায় 230 গুণ বড় কিলোবাইট-রেঞ্জের ফাইলটি তৈরি করবে :)
নায়ারগডস

36
ওফ এফ *** এর জন্য এটি একটি রসিকতা ছিল। আমি কী করলাম?!: Thedailywtf.com/Articles/The- HUmanReadable- এনক্রিপশন- Key.aspx
মো।

26

করুন Base64- প্রকৃতপক্ষে সঠিক উত্তর কিন্তু CDATA যে মূলত এই বলে নয়,: "এই কিছু হতে পারে", তবে এটা হবে না শুধু কিছু হয় তবে তা করুন Base64- বাইনারি ডেটা এনকোড করা হয়েছে। এক্সএমএল স্কিমা বেস 64 বাইনারিটিকে আদিম ডেটাটাইপ হিসাবে সংজ্ঞায়িত করে যা আপনি আপনার এক্সএসডি ব্যবহার করতে পারেন।


2
xs:base64Binaryডেটা টাইপ উল্লেখ করার জন্য অতিরিক্ত পয়েন্ট , যা ব্যবহারের জন্য সঠিক টাইপ।
ক্রিস্টোফার শুল্টজ 21

14

আমি গত সপ্তাহে এই সমস্যা ছিল। আমাকে একটি পিডিএফ ফাইল সিরিয়ালাইজ করতে হয়েছিল এবং এটি একটি এক্সএমএল ফাইলের ভিতরে একটি সার্ভারে প্রেরণ করতে হয়েছিল।

আপনি যদি নেট ব্যবহার করে থাকেন তবে আপনি বাইনারি ফাইলটিকে সরাসরি একটি বেস 64 স্ট্রিংয়ে রূপান্তর করতে পারেন এবং এটি কোনও এক্সএমএল উপাদানটির মধ্যে আটকে রাখতে পারেন।

string base64 = Convert.ToBase64String(File.ReadAllBytes(fileName));

বা, XMLWriter অবজেক্টের ঠিক মধ্যেই একটি পদ্ধতি নির্মিত built আমার বিশেষ ক্ষেত্রে, আমাকে মাইক্রোসফ্টের ডেটাটাইপ নেমস্পেস অন্তর্ভুক্ত করতে হয়েছিল:

StringBuilder sb = new StringBuilder();
System.Xml.XmlWriter xw = XmlWriter.Create(sb);
xw.WriteStartElement("doc");
xw.WriteStartElement("serialized_binary");
xw.WriteAttributeString("types", "dt", "urn:schemas-microsoft-com:datatypes", "bin.base64");
byte[] b = File.ReadAllBytes(fileName);
xw.WriteBase64(b, 0, b.Length);
xw.WriteEndElement();
xw.WriteEndElement();
string abc = sb.ToString();

স্ট্রিং এবিকে এমন কিছু দেখাচ্ছে যা দেখে মনে হচ্ছে:

<?xml version="1.0" encoding="utf-16"?>
<doc>
    <serialized_binary types:dt="bin.base64" xmlns:types="urn:schemas-microsoft-com:datatypes">
        JVBERi0xLjMKJaqrrK0KNCAwIG9iago8PCAvVHlwZSAvSW5mbw...(plus lots more)
    </serialized_binary>
</doc>

সেরা উত্তর কারণ আমি কনভার্ট কপি / পেস্ট করতে পারি। এটি থেকে স্ট্রিং
Eldritch কনন্ড্রাম


5

আপনার বাইনারি ডেটা বেস 64 এনকোডিং / ডিকোড করার চেষ্টা করুন। সিডিএটিএ বিভাগগুলিও দেখুন


4

সম্ভবত এগুলি একটি পরিচিত সেটে এনকোড করুন - বেস 64 এর মতো কিছু জনপ্রিয় পছন্দ।



4

বেস 64 ওভারহেড 33%।

এক্সএমএল 1.0 ওভারহেডের জন্য বেসএক্সএমএল কেবল 20% । তবে এটি কোনও মানক নয় এবং কেবলমাত্র একটি সি বাস্তবায়ন রয়েছে। আপনি যদি ডেটার আকার নিয়ে উদ্বিগ্ন হন তবে এটি পরীক্ষা করে দেখুন। নোট করুন যে যাইহোক ব্রাউজারগুলি সংকোচনের বাস্তবায়ন করতে থাকে যাতে এটির কম প্রয়োজন হয়।

আমি এই থ্রেডে আলোচনার পরে এটি বিকাশ করেছি: এক্সএমএলের মধ্যে বাইনারি ডেটা এনকোডিং: বেস 64 এর বিকল্প


4

অন্য উত্তরগুলি বেশিরভাগই ঠিক থাকলেও আপনি yEnc এর মতো আরও একটি স্থান-দক্ষ, এনকোডিং পদ্ধতি ব্যবহার করতে পারেন। ( yEnc উইকিপিডিয়া লিঙ্ক ) yEnc এর সাথে চেকসামের ক্ষমতাও ঠিক "বাক্সের বাইরে" পান। নীচে পড়ুন এবং লিঙ্কগুলি। অবশ্যই, কারণ XML- এ দেশীয় yEnc টাইপ নেই আপনার এনএমএল স্কোমাটি এনকোডড নোডটি সঠিকভাবে বর্ণনা করতে আপডেট করা উচিত।

কেন : এনকোডিং কৌশলগুলি বেস 64/63 এর কারণে, ইউউনকোড এট আল। এনকোডিংগুলি আপনাকে প্রায় 40% (বনাম yEnc এর 1-2%) দ্বারা সঞ্চয় এবং স্থানান্তর করতে হবে এমন পরিমাণের পরিমাণ (ওভারহেড) বাড়ায়। আপনি কী এনকোডিং করছেন তার উপর নির্ভর করে 40% ওভারহেড একটি সমস্যা হয়ে উঠতে পারে / হতে পারে।


yEnc - উইকিপিডিয়া বিমূর্ত: https://en.wikedia.org/wiki/YEnc yEnc ইউজনেটে ​​বা ই-মেইলের মাধ্যমে বার্তাগুলিতে বাইনারি ফাইল স্থানান্তর করার জন্য বাইনারি টু টেক্সট এনকোডিং স্কিম। ... ইউনকোড এবং বেস 64 এর মতো আগের এনকোডিং পদ্ধতিগুলির চেয়ে yEnc এর অতিরিক্ত সুবিধা হ'ল ডিকোডযুক্ত ফাইলটি অক্ষত রয়েছে কিনা তা যাচাই করতে সিআরসি চেকসামের অন্তর্ভুক্তি।


2
@ জামিন তাই আপনার কি অন্য কোন বিকল্প আছে?
হান্ট

জেমি, এটি আরও কিছু কাজ দেওয়া একটি শালীন উত্তর হতে পারে। আমি আমার -1 সরিয়েছি এবং আপনি যদি কিছু চেষ্টা করে থাকেন তবে +1 করব ... আপনি অনুসরণ করলে আমাকে ফ্ল্যাগ করুন।
পল সাসিক

জেমি, এন / মি। আমি আপনার উত্তর আপডেট করেছি, এবং +1ed, আশা করি এমন তথ্য দিয়ে যা আপনি মূলত বোঝাতে চেয়েছিলেন। আপনি যেমন দেখতে চান ঠিক তেমন একটি উঁকি দিয়ে দেখুন এবং আপডেট করুন। (আমি কিছু সময়ের জন্য এসও-তে সক্রিয় ছিলাম না research উত্তরটি গবেষণা এবং সম্পাদনা করতে মজা লাগছিল I
পল সাসিক

পূর্বাভাসযোগ্য / স্থির ওভারহেডের সমালোচনা হলে পলায়নহীন হ'ল yEnc এর বিকল্প হতে পারে।
ইভান কোসারেভ


0

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

এটির traditionalতিহ্যবাহী সমাধানটি একটি সংরক্ষণাগার (যেমন টার) tar তবে আপনি যদি নিজের বদ্ধ দস্তাবেজটিকে একটি পাঠ্য-ভিত্তিক ফর্ম্যাটে রাখতে চান বা যদি আপনার কাছে কোনও ফাইল সংরক্ষণাগার লাইব্রেরিতে অ্যাক্সেস না থাকে তবে একটি মানকীয় স্কিমও রয়েছে যা ইমেল এবং এইচটিটিপি-তে ভারী ব্যবহৃত হয় যা মাল্টিপার্ট / * এমএমআইএম সহ সামগ্রী-স্থানান্তর-এনকোডিং: বাইনারি

উদাহরণস্বরূপ, যদি আপনার সার্ভারগুলি HTTP- র মাধ্যমে যোগাযোগ করে এবং আপনি একটি মাল্টিপার্ট ডকুমেন্ট প্রেরণ করতে চান তবে প্রাথমিকভাবে এটি এক্সএমএল নথি যা বাইনারি ডেটা বোঝায়, HTTP যোগাযোগটি এর মতো দেখতে পারে:

POST / HTTP/1.1
Content-Type: multipart/related; boundary="qd43hdi34udh34id344"
... other headers elided ...

--qd43hdi34udh34id344
Content-Type: application/xml

<myxml>
    <data href="cid:data.bin"/>
</myxml>
--qd43hdi34udh34id344
Content-Id: <data.bin>
Content-type: application/octet-stream
Content-Transfer-Encoding: binary

... binary data ...
--qd43hdi34udh34id344--

উপরোক্ত উদাহরণ হিসাবে, এক্সএমএল একটি cidইউআরআই স্কিম ব্যবহার করে বদ্ধমূল মাল্টিপার্টের বাইনারি ডেটা উল্লেখ করে যা সামগ্রী-আইডি শিরোলেখের সনাক্তকারী। এই স্কিমের ওভারহেডটি কেবল মাইএম শিরোলেখ হবে। অনুরূপ স্কিম এইচটিটিপি প্রতিক্রিয়া হিসাবেও ব্যবহার করা যেতে পারে। অবশ্যই এইচটিটিপি প্রোটোকলে, আপনার কাছে পৃথক অনুরোধ / প্রতিক্রিয়াতে একটি মাল্টিপার্ট ডকুমেন্ট প্রেরণের বিকল্প রয়েছে।

আপনি যদি কোনও মাল্টিপার্টে আপনার ডেটা মোড়ানো এড়াতে চান তবে ডেটা ইউআরআই ব্যবহার করা:

<myxml>
    <data href="data:application/something;charset=utf-8;base64,dGVzdGRhdGE="/>
</myxml>

তবে এটি বেস 64 ওভারহেড আছে।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.