জাভা কি সামান্য এন্ডিয়ান বা বড় এন্ডিয়ানতে পূর্ণসংখ্যা পড়তে পারে?


96

আমি জিজ্ঞাসা করছি কারণ আমি একটি সি প্রক্রিয়া থেকে জাভাতে বাইট স্ট্রিম প্রেরণ করছি। সি দিকে 32 বিট পূর্ণসংখ্যার এলএসবি প্রথম বাইট এবং এমএসবি 4 তম বাইট রয়েছে।

সুতরাং আমার প্রশ্নটি: জাভা সাইডে যখন আমরা বাইটটি পড়ি যেমন এটি সি প্রক্রিয়া থেকে প্রেরণ করা হয়েছিল, জাভা দিকের এন্ডিয়ান কী ?

একটি ফলো-আপ প্রশ্ন: জাভা দিকের এন্ডিয়ান যদি প্রেরিতের মতো না হয় তবে আমি কীভাবে তাদের মধ্যে রূপান্তর করতে পারি?


4
এখানে এটির জন্য আমার স্মৃতিবিদ্যাগুলি তাই আমি ভুলব না: জাভা কোনও হার্ডওয়্যার নয় বরং পরিবর্তে ভার্চুয়াল হ'ল ইন্টারনেটের ভাষা। নেটওয়ার্কের বাইট অর্ডার হয় বড় endian । সুতরাং, জাভা বড় endian হয়
ইগেনফিল্ড

উত্তর:


67

নেটওয়ার্ক বাইট অর্ডার (বিগ এন্ডিয়ান) ব্যবহার করুন যা জাভা যেভাবেই ব্যবহার করে ঠিক একই। সি-তে বিভিন্ন অনুবাদকের জন্য ম্যান এইচটনস দেখুন


আমি এখন আমার লিনাক্স বাক্সে নেই তবে এইচটিএসও কি আদর্শ ল্যাবগুলির মধ্যে একটি?
হাফেজ

মতে h30097.www3.hp.com/docs//base_doc/DOCUMENTATION/V51_HTML/MAN/... মান গ লাইব্রেরির তার অংশ, হ্যাঁ
Egil

4
এইচটিএন প্রায় সর্বত্র উপলব্ধ, তবে এটি আইএসও সি তে নেই
এমএসএলটাররা

4
যদি আপনাকে নেটওয়ার্ক বাইট অর্ডার ব্যতীত অন্য কিছু ব্যবহার করতে হয় তবে আপনি নিজেই বিটওয়াইয়া অপারেটরগুলির সাথে নিজের রোল করুন বা java.nio.Buffer এর বিভিন্ন সংস্করণ ব্যবহার করুন
ডারন

4
এর ম্যান-পেজ অনুসারে এটি POSIX.1 এ সংজ্ঞায়িত হয়েছে, তাই এটি সর্বত্র যে কোনও জায়গায় পাওয়া উচিত। এবং আমি মনে করি এটি Win32 এ ব্যবহার করা মনে আছে, সুতরাং এটি কেবল পসিক্স সিস্টেমে নয়।
জোছিম সউর

50

আমি গুগলের মাধ্যমে এখানে হোঁচট খেয়েছি এবং আমার উত্তর পেয়েছে যে জাভা বড় এন্ডিয়ান

প্রতিক্রিয়াগুলি পড়তে আমি উল্লেখ করতে চাই যে বাইটগুলির প্রকৃতপক্ষে একটি এন্ডিয়ান অর্ডার রয়েছে যদিও করুণার সাথে, আপনি যদি কেবলমাত্র "মূলধারার" মাইক্রোপ্রসেসরের সাথে কাজ করে থাকেন তবে আপনি সম্ভবত এটি ইন্টেল, মোটোরোলা এবং জিলোগের মতো মুখোমুখি হতে পারেন না all তাদের ইউআরটি চিপগুলির শিফট দিকের বিষয়ে একমত হয়েছে এবং বাইটের এমএসবি হবে 2**7এবং এলএসবি 2**0তাদের সিপিইউতে থাকবে (আমি এই জিনিসটি কত পুরানো তা জোর দেওয়ার জন্য ফরট্রান পাওয়ার স্বরলিপি ব্যবহার করেছি :))।

20+ বছর আগে যখন আমরা একটি ম্যাক কম্পিউটারের সাথে 10 ডলার ইন্টারফেস হার্ডওয়্যার প্রতিস্থাপন করেছি তখন আমি কিছু স্পেস শাটল বিট সিরিয়াল ডাউনলিংক ডেটা নিয়ে এই ইস্যুটিতে প্রবেশ করি। এটি সম্পর্কে একটি নাসা টেক সংক্ষিপ্ত প্রকাশিত হয়েছে অনেক আগে। table[0x01]=0x80প্রতিটি বাইট বিট স্ট্রিম থেকে স্থানান্তরিত হওয়ার পরে আমি বিটগুলি বিপরীত ( ইত্যাদি) সহ একটি 256 এলিমেন্ট লুক আপ টেবিলটি ব্যবহার করেছি ।


দুর্দান্ত অন্তর্দৃষ্টি! আমার এই প্রশ্নটি আছে এবং ওয়েবে কোনও উত্তর নেই।
Xolve

যদি সেগুলির কোনও প্রকাশ্য হয়, আপনি যে নাসা প্রযুক্তি সংক্ষেপে (এবং পেটপেস স্পেস শটল বিট সিরিয়াল ডাউনলিংক ডেটা) কথা বলছেন তা লিঙ্ক করতে পারবেন? চিত্তাকর্ষক হবে, আমি এর মতো জিনিস কখনও দেখিনি।
n611x007

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

বিট শুরু করে, আমি ভেবেছিলাম যে এটি দীর্ঘ সময়ের জন্য অন্তর্নিহিততা।
রায় ফালক

20

জাভাতে কোনও স্বাক্ষরবিহীন পূর্ণসংখ্যা নেই। সমস্ত পূর্ণসংখ্যা স্বাক্ষরিত হয় এবং বড় এডিয়ান।

সি পাশের প্রতিটি বাইটটি শুরুতে এলএসবি টান করে বামদিকে এবং শেষে এমএসবি।

মনে হচ্ছে আপনি এলএসবিকে সবচেয়ে কম গুরুত্বপূর্ণ হিসাবে ব্যবহার করছেন, আপনি কি? এলএসবি সাধারণত কমপক্ষে উল্লেখযোগ্য বাইট হিসাবে দাঁড়ায়। এন্ডিয়নেসনেট বিট ভিত্তিক নয় বাইট ভিত্তিক।

স্বাক্ষরবিহীন বাইট থেকে জাভা সংখ্যায় রূপান্তর করতে:

int i = (int) b & 0xFF;

বাইটে স্বাক্ষরযুক্ত 32-বিট লিটল এন্ডিয়ান থেকে জাভা লংতে রূপান্তর করতে (আমার মাথার উপরের দিক থেকে, পরীক্ষা করা হয়নি):

long l = (long)b[0] & 0xFF;
l += ((long)b[1] & 0xFF) << 8;
l += ((long)b[2] & 0xFF) << 16;
l += ((long)b[3] & 0xFF) << 24;

ঠিক বুঝতে পেরেছি: $ সুতরাং কীভাবে আমার জাভা প্রক্রিয়াটি সঠিকভাবে পড়তে পাঠাতে এই স্বাক্ষরযুক্ত ছোট্ট এন্ডিয়ানকে পাঠানোর কথা?
হাফেজ

হ্যাঁ আমি বলতে চাইছিলাম যে এলএসবি 4 বাইটের শুরুতে (এটি একটি স্বাক্ষরযুক্ত 32 বিট ইনট) তাই আমি কমপক্ষে উল্লেখযোগ্য বাইট বলতে
চাইছিলাম

এছাড়াও আমি সি থেকে রূপান্তর করছি -> জাভা থেকে জাভা নয় -> সি :)
হাফেজ

আপনার কোডটি সূক্ষ্মভাবে কাজ করে, যতক্ষণ আপনি শেষ তিন লাইনে 0xFF এর পরে আধা-কোলন সরিয়ে ফেলেন। আমি নিজে এটি সম্পাদনা করতাম তবে এটি 6 টিরও কম অক্ষরের পরিবর্তন।
মজ মোরালস

4
এটি প্রায় 8 বছর সময় নিয়েছে তবে শেষ পর্যন্ত কেউ সিনট্যাক্স ত্রুটিটি স্পষ্ট করেছে। ধন্যবাদ @ মুজমোরালস :)
জোনাস

12

জাভাতে এটি কোনও কিছুর উপর প্রভাব ফেলতে পারে এমন কোনও উপায় নেই, যেহেতু জাভাতে কিছু বাইট ম্যাপ করার কোনও (সরাসরি নন-এপিআই) উপায় নেই।

প্রতিটি বা এটির মতো অনুরূপ কিছু এপিআই আচরণটি বেশ সুনির্দিষ্টভাবে সংজ্ঞায়িত করে, তাই আপনার সেই API এর ডকুমেন্টেশন সন্ধান করা উচিত।


4
ওহ নিশ্চিত আছে। বাইনারি গণিত (&, |, <<, ইত্যাদি) বাইটস এবং ইনসগুলিতে ঠিক কাজ করে works ইচ্ছামত বাইট নেওয়া এবং এটিকে পূর্ণসংখ্যায় আটকে রাখা বেশ সহজ।
হার্মেস

8
তবে আপনি যদি এটি করেন তবে আপনি এখনও বলতে পারবেন না যে আপনার জেভিএম অভ্যন্তরীণভাবে কী পরিণতি ব্যবহার করে।
ড্যারন

4
হ্যাঁ, তবে আপনি সেখানে সরাসরি ম্যাপিং করছেন না। আপনি গাণিতিক ব্যবহার করছেন যা আপনি যা বলছেন ঠিক তেমন করে, কোনও দ্বিধা নেই। সিতে আপনি সর্বদা একটি "বাইট *" "একটি" দীর্ঘ * "এ কাস্ট করতে পারেন এবং এটি ডি-রেফারেন্স করতে পারেন। তারপরে আপনার চূড়ান্ততা সম্পর্কে যত্ন নিতে হবে। জাভাতে এটি করার কোনও প্রত্যক্ষ, অস্পষ্ট উপায় নেই।
জোছিম সউর

আহ আমি দেখি. আপনি কাস্টের বিষয়ে কথা বলছিলেন, বাইনারি গণিত নয়। হ্যাঁ, এই ক্ষেত্রে আপনি ঠিক বলেছেন।
হার্মেস

10
"ডকুমেন্টেশন সন্ধান করুন" এর জন্য +1 , তবে দ্রষ্টব্য: আজকাল NIO প্যাকেজটি বাইটবফার সরবরাহ করে যা বাইটগুলি আদিমদের ম্যাপ করতে পারে এবং যেখানে আপনি বাইট ক্রম পরিবর্তন করতে পারবেন। দেখুন ByteBuffer এবং ByteOrder
user85421

3

আমি এক এক করে বাইটগুলি পড়তাম এবং সেগুলি একটি দীর্ঘ মূল্যের সাথে একত্রিত করতাম । এইভাবে আপনি পরিণতি নিয়ন্ত্রণ করতে পারেন এবং যোগাযোগের প্রক্রিয়াটি স্বচ্ছ।


আপনি আমাকে কেন ভোট দিচ্ছেন সে সম্পর্কে মন্তব্য করতে যত্নশীল?
ওয়াউটার লিভেন্সস

কারণ আমি যদি প্রতিটি বাইট পৃথকভাবে পড়তে পারি তবে যে বাইটটি প্রেরণ করা হয় তার সমাপ্তিটি ভুল হবে তাই আমার এটি রূপান্তর করতে হবে
হাফেজ

23
একটি বাইট শেষ? কি হচ্ছে এসব? শব্দগুলি শেষের দিকে সংবেদনশীল, স্বতন্ত্র বাইটগুলি হয় না।
ওয়াউটার লাইভেন্স

4
@ হাফেজ এটি সত্য নয়, বাইটস দ্বারা বাইট দ্বারা বাইটি পড়লে আমাদের যতটা উদ্বিগ্ন হওয়া দরকার, ততক্ষণ আপনি প্রোগ্রামার বাইটসকে যথাযথ জায়গায় নির্ধারিত করার জন্য দায়বদ্ধ। এটি হ'ল ডেটা ইনপুটস্ট্রিম, এটি হুডসের নীচে একটি বড় এন্ডিয়ান উপায়ে কেবল বাইটগুলি একত্রিত করে।
টি

4
@ ওয়াটারলিভেনস: আমি কিছু আই / ও ডিভাইসগুলির মুখোমুখি হয়েছি (যেমন একটি রিয়েল-টাইম ক্লক চিপ) যা কারণেই হোক না কেন, বিট-বিপরীত বিন্যাসে ডেটা প্রেরণ করে; তাদের কাছ থেকে ডেটা পাওয়ার পরে, প্রতিটি বাইটে বিটগুলি বিপরীত করা প্রয়োজন। আমি আপনার সাথে একমত, যদিও, বাইটস এর এন্ডিয়ান-নেস সাধারণত কোনও সমস্যা হয় না , যদি না কারো নির্দিষ্ট অদ্ভুতভাবে ডিজাইন করা হার্ডওয়ারের সাথে মোকাবেলা করতে হয়।
সুপারক্যাট

3

এটি যদি আপনি ব্যবহার করেন এমন প্রোটোকলের সাথে মানানসই হয় তবে কোনও ডেটা ইনপুটস্ট্রিম ব্যবহার করার বিষয়টি বিবেচনা করুন, যেখানে আচরণটি খুব ভালভাবে সংজ্ঞায়িত


4
তিনি কেবল তখনই তা করতে পারেন যদি তার প্রোটোকল একই সমাপ্তি ব্যবহার করে।
ওয়াউটার লিভেন্সস

আমি লিঙ্কটি ঠিক করেছি এবং এটি বর্তমান রিলিজে জাভা 9-তে নির্দেশিত করেছি। প্রশ্নে থাকা এপিআইটি জাভা 1.0 তে প্রবর্তিত হয়েছিল, যদিও।
জেনস ব্যানম্যান

2

উপরে বর্ণিত জাভা হ'ল 'বিগ-এন্ডিয়ান'। এর অর্থ হ'ল আপনি যদি মেমরি পরীক্ষা করেন (অন্তত একটি ইন্টেল সিপিইউতে) কোন int এর এমএসবি বাম দিকে থাকে। সমস্ত জাভা পূর্ণসংখ্যার ধরণের জন্য সাইন বিটটি এমএসবিতেও রয়েছে।
একটি 'লিটল-এন্ডিয়ান' সিস্টেম দ্বারা সঞ্চিত বাইনারি ফাইল থেকে 4 বাইট স্বাক্ষরযুক্ত পূর্ণসংখ্যা পড়া জাভাতে কিছুটা অভিযোজন গ্রহণ করে। ডেটা ইনপুট স্ট্রিমের রিডইন্ট () বিগ-এন্ডিয়ান ফর্ম্যাটটি প্রত্যাশা করে।
এখানে একটি উদাহরণ যা একটি চারটি বাইট স্বাক্ষরবিহীন মান (যেহেতু HexEdit দ্বারা 01 00 00 00 হিসাবে প্রদর্শিত হবে) 1 এর মান সহ পূর্ণসংখ্যায় পড়ে:

 // Declare an array of 4 shorts to hold the four unsigned bytes
 short[] tempShort = new short[4];
 for (int b = 0; b < 4; b++) {
    tempShort[b] = (short)dIStream.readUnsignedByte();           
 }
 int curVal = convToInt(tempShort);

 // Pass an array of four shorts which convert from LSB first 
 public int convToInt(short[] sb)
 {
   int answer = sb[0];
   answer += sb[1] << 8;
   answer += sb[2] << 16;
   answer += sb[3] << 24;
   return answer;        
 }

"উপরে উল্লিখিত" কী বোঝায়? যে ক্রমে এসও উত্তরগুলি প্রদর্শিত হয় তা বিভিন্ন রকম হতে পারে।
লার্শ

0

জাভা শক্তি প্রকৃতপক্ষে বড় এন্ডিয়ান: https://docs.oracle.com/javase/specs/jvms/se8/html/jvms-2.html#jvms-2.11


4
এটি বাইটকোড নির্দেশাবলীর অন্তর্নিহিতা সম্পর্কে, রানটাইমের সময় ডেটাগুলির অন্তর্নিহিতা নয়।
কেয়া

আমি ভোট দিচ্ছি এই স্নিপেট byte[] bbb = ByteBuffer.allocate(4).putFloat(0.42f).array();একটি byteঅ্যারে C/C++তৈরি করেছে যা আমার উত্পাদিত সামগ্রীর বিপরীত । অতএব, জাভা এর বড় অন্তিমতা রানটাইম সময় ডেটা এমনকি কার্যকর করে।
ইগেনফিল্ড
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.