لا جافا قراءة الأعداد الصحيحة في little endian أو endian كبير?

StackOverflow https://stackoverflow.com/questions/362384

  •  21-08-2019
  •  | 
  •  

سؤال

أنا أسأل لأنني إرسال البايت دفق من ج عملية جافا.على الجانب ج 32 بت عدد صحيح وقد LSB هو البايت الأول و MSB هو 4 بايت.

لذا سؤالي هو:على جافا الجانب عندما نقرأ بايت كما تم إرسالها من C العملية ، ما هو endian على جافا الجانب ؟

متابعة السؤال:إذا كان endian على جافا الجانب ليس من نفس واحدة أرسلت كيف يمكنني تحويل بينهما ؟

هل كانت مفيدة؟

المحلول

استخدم ترتيب شبكة بايت (endian كبيرة)، والذي هو نفس يستخدم جافا على أي حال. رؤية رجل htons للمترجمين مختلفين في C.

نصائح أخرى

وأنا تعثرت هنا عن طريق غوغل وحصلت على الجواب الذي جافا endian كبيرة.

ومن خلال قراءة الردود أود أن أشير إلى أن بايت لديها بالفعل أمر endian، على الرغم من حسن الحظ، إذا كنت قد تناولت فقط مع "التيار" المعالجات التي من غير المرجح أن يكون اجهت أي وقت مضى أنها إنتل، وموتورولا، وزيلوج اتفق الجميع على اتجاه التحول من رقائق UART والتي MSB من بايت سيكون 2 ** 7 و LSB سيكون 2 ** 0 في وحدات المعالجة المركزية الخاصة بهم (أنا استخدم تدوين السلطة FORTRAN للتأكيد على مدى العمر هذه الاشياء هي: )).

وجريت إلى هذه المسألة مع بعض مكوك الفضاء بت البيانات الهابطة التسلسلي 20+ منذ سنوات عندما كنا استبدال الأجهزة واجهة $ 10K مع جهاز كمبيوتر ماك. هناك باختصار NASA تك نشرت حول هذا الموضوع منذ فترة طويلة. أنا ببساطة استخدام 256 عنصر جدول البحث مع بت عكس (الجدول [0x01] = 0x80 الخ) بعد أن تحولت كل بايت من الناحية تيار بت.

وليس هناك الأعداد الصحيحة غير الموقعة في جاوة. يتم توقيع جميع الأعداد الصحيحة وفي endian كبيرة.

<اقتباس فقرة>   

في الجانب C تمت TNE في كل بايت LSB في بداية على اليسار وMSB في نهاية المطاف.

وهذا يبدو وكأنه كنت تستخدم LSB كما أقل قليلا كبير، وأنت؟ LSB عادة لتقف على الأقل بايت كبير. Endianness لا يقوم بعض الشيء ولكن بايت القائمة.

لتحويل من البايت غير موقعة إلى عدد صحيح جافا:

int i = (int) b & 0xFF;

لتحويل من غير موقعة 32 بت Endian طفيف في البايت [] لفترة طويلة جافا (من أعلى رأسي، لم تختبر):

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

ولا توجد طريقة هذا يمكن أن تؤثر على أي شيء في جافا، منذ ليس هناك (غير API المباشر) وسيلة لتعيين بعض بايت مباشرة إلى عدد صحيح في جافا.

وكل API أن يفعل هذا أو شيئا من هذا القبيل يحدد السلوك جدا على وجه التحديد، لذلك يجب أن ننظر حتى وثائق من هذا API.

أود أن قراءة بايت واحدة تجمع لهم في طويلة القيمة.بهذه الطريقة يمكنك التحكم في endianness ، عملية الاتصال شفافة.

إذا كان يناسب البروتوكول الذي تستخدمه، النظر في استخدام DataInputStream، حيث السلوك هو <وأ href = "https://docs.oracle.com/javase/9/docs/api/java/io/DataInput.html #readInt () "يختلط =" نوفولو noreferrer "> جدا واضحة المعالم .

وجافا هو 'BIG-endian "كما ذكر أعلاه. وهذا يعني أن MSB من عدد صحيح على اليسار إذا كنت فحص الذاكرة (على وحدة المعالجة المركزية إنتل على الأقل). بت تسجيل هو أيضا في MSB لجميع أنواع صحيح جافا.
قراءة العدد الصحيح 4 بايت من ملف ثنائي تخزينها بواسطة نظام "Endian طفيف" يتطلب قليلا من التكيف في جاوة. readInt DataInputStream ل() تتوقع شكل كبير-endian.
وإليك مثال الذي يقرأ قيمة غير موقعة أربعة بايت (كما هو معروض من قبل 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;        
 }
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top