Скорее всего, я ошибаюсь, ибо "кроссплатформенные тормоза" стараюсь благополучно забыть. Сильно не пинать.
Вместо
for (int i = 0; i < 16; ++i) {
System.arraycopy(bloc, 4*i, blocs[i], 0, 4);
System.out.println(blocs[i]);
ws[i] = byteArrayToInt(blocs[i]);
System.out.println("ws[i] = " + ws[i]);
}
попробуй
ByteBuffer bbuf = ByteBuffer.wrap(bloc);
bbuf.order(LITTLE_ENDIAN); /// или bbuf.order(BIG_ENDIAN); , не помню
for (int i = 0; i < 16; ++i) {
ws[i] = bbuf.getInt(i*4);
System.out.println("ws[i] = " + ws[i]);
}
В том, что идет ниже, я потерялся, не соображу, где и чем ты заполняешь значениями элементы blocs[16] - blocs[63], и что с ними потом делаешь.
bb.toString(), судя по мануалу, выдает то, что задумано - состояние буфера, а не содержимое.