سؤال

أحاول تحويل فترة قصيرة إلى 2 بايت ... ثم من تلك البايتات يحاولون الحصول على نفس القيمة القصيرة. لذلك ، لقد كتبت هذا الرمز:


        short oldshort = 700;

        byte 333= (byte) (oldshort);
        byte byte2= (byte) ((oldshort >> 8) & 0xff);

        short newshort = (short) ((byte2 << 8) + byte1);

            System.out.println(oldshort);
        System.out.println(newshort);

بالنسبة لقيمة 700 (Oldshort) ، فإن Newhosrt هو 444. بعد بعض الاختبارات ، يبدو رمز Ike tthis لا يعمل إلا لبعض القيم. مثل ... إذا كان Oldshort = 50 ، فسيعمل بشكل جيد .. ولكن إذا كان -200 ، أو قيم أكبر من 127 (على ما أظن) لا يعمل. أظن أن هناك مشكلة في البايتات الموقعة ، والقيمة المكملة للثاني ، وما إلى ذلك ... لكن لا يمكنني معرفة كيفية حلها.

اي فكرة؟؟ أي طريقة محلية للقيام بذلك في جافا ؟؟ شكرا مقدما!

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

المحلول

عند إعادة التركيب ، تحتاج إلى إخفاء BYTE1 لمنع تمديدها.

على سبيل المثال

    short oldshort = 700;

    byte byte1= (byte) (oldshort);
    byte byte2= (byte) ((oldshort >> 8) & 0xff);

    short newshort = (short) ((byte2 << 8) + (byte1&0xFF);

        System.out.println(oldshort);
    System.out.println(newshort);

تحرير: جميع العمليات على البايتات والسراويل القصيرة في Java تتم فعليًا كمناسبات صحيحة. لذلك عندما تكتب+byte1, ، ما يحدث بالفعل هو أن البايت يتم إلقاؤه لأول مرة إلى عدد صحيح (تم تمديده بالتوقيع). سيظل لديه نفس القيمة ، ولكن لديه الآن المزيد من البتات. يمكننا بعد ذلك إخفاء 8 بتات من أسفل 8 بتات للحصول على 8 بتات الأصلية من القصيرة - دون العلامة.

E.g. short =511 = 0x01FE
     // lots of 0x000's because the operations are done on 32-bit int's
     byte1 = (0x000001FE & 0x000000FF) = (0x01FE & 0xFF) = 0xFE = (byte)-2
     byte2 = 0x1

     newShort = (byte2 << 8) + (byte1 & 0xFF)
              = (0x1 << 8) + (0xFE & 0xFF)
            // since the ops are performed as int's
              = (0x00000001 << 8) + (0xFFFFFFFE & 0x000000FF)
            // 0xFFFFFFFE = -2 
              = (0x00000100) + (0x000000FE)
              = 0x000001FE
              = 511

نصائح أخرى

يمكنك أيضا استخدام com.google.common.primitives.Shorts, التي لها طرق:

  • public static byte[] toByteArray(short value)
  • public static short fromByteArray(byte[] bytes)
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top