функция возвращает не правильное значение
пробую в 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 шт):
надо 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;
}
Если я правильно понял то, что вы хотите сделать, то метод 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).
private int get_num(byte[] n) {
return (((((n[3] & 0xFF << 8) | n[2] & 0xFF) << 8) | n[1] & 0xFF) << 8) | n[0] & 0xFF;
}