функция возвращает не правильное значение

пробую в java android нарисовать спрайт. спрайт загружается из assets и имеет вид файла данных, а не картинку. в этом файле сначала идет int width, потом int height, потом int max_pixels. Если в си программе считать с помощью fread ( &max_pixels, sizeof ( int ), 1, fp ); так как в java так нельзя делать, я выделил четыре байта для каждой величины, считал их, и перевел с помощью функции get_num в число. и проблема в том что android считывает smax_pixels и возвращает 192, а надо 85440. я посмотрел в hex значениях и оказывается что число 85440 имеет значение 14dc0, а 192 имеет значение c0. такое впечатление будто число обрубается. значит что-то в коде не так, но что?

private int get_num ( byte[] n ) {
    int num = 0;
    num |= n[0] <<  0 & 0xff;
    num |= n[1] <<  8 & 0xff;
    num |= n[2] << 16 & 0xff;
    num |= n[3] << 24 & 0xff;
    return num;
}

public void load_sprite ( String path ) {


    byte[] swidth = new byte[4];
    byte[] sheight = new byte[4];
    byte[] smax_pixel = new byte[4];

    try {
        InputStream input = activity.getAssets().open("models/" + path);
        input.read ( swidth );
        input.read ( sheight );
        input.read ( smax_pixel );

        width = get_num(swidth);
        height = get_num(sheight);
        max_pixels = get_num(smax_pixel);

        max_pixels = 85440;
        data = new byte[max_pixels];
        input.read(data);
        input.close();
    } catch ( IOException ex ) {
        ex.printStackTrace();
    }


}

Ответы (3 шт):

Автор решения: xverizex

надо get_num сделать такой.

int get_num ( byte[] n ) {
  int num = 0;
  num |= ( n[0] & 0xff ) <<  0;
  num |= ( n[1] & 0xff ) <<  8;
  num |= ( n[2] & 0xff ) << 16;
  num |= ( n[3] & 0xff ) << 24;
  return num;
}
→ Ссылка
Автор решения: StateItPrimitive

Если я правильно понял то, что вы хотите сделать, то метод get_num должен выглядеть следующим образом:

private static int get_num(byte[] n) {
    int num = 0;
    num |= 0x00_00_00_FF & n[0];
    num |= 0x00_00_FF_00 & (n[1] << 8);
    num |= 0x00_FF_00_00 & (n[2] << 16);
    num |= 0xFF_00_00_00 & (n[3] << 24);
    return num;
}

Пояснение:

Скобки перед оператором << (Signed left shift) можно опустить (оставил их для наглядности), т.к. он имеет более высокий приоритет, чем оператор & (Bitwise AND) (см здесь).

В рамках данного примера решения происходит Widening Primitive Conversion (неявное распространение примитивов) byte -> int при использовании оператора <<, поэтому для избежания ситуаций распространения ненулевого старшего бита экземпляра byte на все более старшие биты получаемого экземпляра int (например, 0b1000_0000 -> 0b11...1_0000_0000, а нам нужно 0b00...1_0000_0000).

В первой строчке оператор << опущен в виду избыточности, поэтому распространение происходит за счет использования оператора &, одним из операндов которого является литерал типа int.

Рекомендации:

В рамках java для наименования методов согласно naming conventions принято использовать стиль camelCase (getNum), а не snake_case, как у вас (get_num).

→ Ссылка
Автор решения: Qwertiy
private int get_num(byte[] n) {
  return (((((n[3] & 0xFF << 8) | n[2] & 0xFF) << 8) | n[1] & 0xFF) << 8) | n[0] & 0xFF;
}
→ Ссылка