كيف يمكنني الوصول إلى مجموعة بايت كسرون في جافا

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

  •  21-09-2019
  •  | 
  •  

سؤال

لدي مجموعة من البايت ، الحجم n ، والتي تمثل حقًا مجموعة من الحجم N/2. قبل أن أكتب المصفوفة إلى ملف القرص ، أحتاج إلى ضبط القيم عن طريق إضافة قيم التحيز المخزنة في مجموعة أخرى من القصيرة. في C ++ ، أود فقط تعيين عنوان صفيف البايت إلى مؤشر لمجموعة قصيرة مع ممثلين لاختصار واستخدام حساب المؤشر أو استخدام الاتحاد.

كيف يمكن القيام بذلك في Java - أنا جديد جدًا على Java BTW.

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

المحلول

يمكنك لف مجموعة البايت الخاصة بك مع java.nio.bytebuffer.

byte[] bytes = ...
ByteBuffer buffer = ByteBuffer.wrap( bytes );

// you may or may not need to do this
//buffer.order( ByteOrder.BIG/LITTLE_ENDIAN );

ShortBuffer shorts = buffer.asShortBuffer( );

for ( int i = 0, n=shorts.remaining( ); i < n; ++i ) {
    final int index = shorts.position( ) + i;

    // Perform your transformation
    final short adjusted_val = shortAdjuster( shorts.get( index ) );

    // Put value at the same index
    shorts.put( index, adjusted_val );
}

// bytes now contains adjusted short values

نصائح أخرى

يمكنك القيام بتوجيه بت نفسك ولكن أوصي بإلقاء نظرة على ByteBuffer و ShortBuffer الطبقات.

byte[] arr = ...
ByteBuffer bb = ByteBuffer.wrap(arr); // Wrapper around underlying byte[].
ShortBuffer sb = bb.asShortBuffer(); // Wrapper around ByteBuffer.

// Now traverse ShortBuffer to obtain each short.
short s1 = sb.get();
short s2 = sb.get(); // etc.

الطريقة الصحيحة للقيام بذلك هي استخدام التحولات. لذا

for (int i = 0; i < shorts.length; i++) {
    shorts[i] = (short)((bytes[2*i] << 8) | bytes[2*i + 1]);
}

أيضا ، يعتمد على endian-ness من التيار في كثير من النواحي. قد يعمل هذا بشكل أفضل

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top