Newsgroup: it.comp.java
Titolo: Re: Da byte array a int di 10bit

 bit ?
http://mindprod.com/jgloss/binary.html
-- 
Andrea Francia
http://andreafrancia.blogspot.com/2008/07/colinux-linux-dentro-windows.html

 bit ?
Non l'ho testata completamente:
public class Main {
     /*
      * Copyright: Andrea Francia 2008
      */
     public static int[] decode(byte[] bytes)
     {
         //[byte 4][byte 3][byte 2][byte 1][byte 0]
         //7654321076543210765432107654321076543210
         //[int 3   ][int 2   ][int 1   ][int 0   ]
         //9876543210987654321098765432109876543210
         //masks
         //                                11111111 0xFF
         //                        00000011         0x03
         //                        11111100         0xFC
         //                00001111                 0x0F
         //                11110000                 0xF0
         //        00111111                         0x3F
         //        11000000                         0xC0
         //11111111                                 0xFF
         int int0 = ((bytes[1] & 0x03) << 8) | (bytes[0] & 0xff) >> 0;
         int int1 = ((bytes[2] & 0x0f) << 6) | (bytes[1] & 0xfc) >> 2;
         int int2 = ((bytes[3] & 0x3f) << 4) | (bytes[2] & 0xf0) >> 4;
         int int3 = ((bytes[4] & 0xff) << 2) | (bytes[3] & 0xc0) >> 8;
         return new int[] {int0, int1, int2, int3};
     }
}
public class MainTest {
     @Test
     public void testDecode() {
         byte[] input = new byte[5];
         input[0] = (byte) 0xff;
         input[1] = 0;
         input[2] = 0;
         input[3] = 0;
         input[4] = 0;
         int[] expected = new int[4];
         expected[0] = 0xff;
         expected[1] = 0;
         expected[2] = 0;
         expected[3] = 0;
         int[] result = Main.decode(input);
         System.out.println("result:" + Arrays.toString(result));
         System.out.println("expected:" + Arrays.toString(expected));
         assertTrue("differs", Arrays.equals(expected, result));
     }
     @Test
     public void testDecode2() {
         byte[] input = new byte[5];
         input[0] = (byte) 0xff;
         input[1] = (byte) 0x03;
         input[2] = 0;
         input[3] = 0;
         input[4] = 0;
         int[] expected = new int[4];
         expected[0] = 1023;
         expected[1] = 0;
         expected[2] = 0;
         expected[3] = 0;
         int[] result = Main.decode(input);
         System.out.println("result:" + Arrays.toString(result));
         System.out.println("expected:" + Arrays.toString(expected));
         assertTrue("differs", Arrays.equals(expected, result));


Come faccio ad estrarre sequenzialmente i 4 interi ?
Se hai 5 byte vuol dire che avrai 40 bit e che i bit di ciascun intero
saranno cosě suddivisi:
8 del primo byte   + 2 del secondo byte 
6 del secondo byte + 4 del terzo byte   
4 del terzo byte   + 6 del quarto byte  
2 del quarto byte  + 8 del quinto byte  
quindi supponendo che primo, secondo, terzo, quarto e quinto byte
corrispondano agli indici 0, 1, 2, 3, 4 avrai
intero[0] = (tuoByte[0] << 2) + (tuoByte[1] >> 6);
intero[1] = (tuoByte[1] & 0x3F) << 4 + (tuoByte[2] >> 4);
intero[2] = (tuoByte[2] & 0x0F) << 6) + (tuoByte[3] >> 2);
intero[3] = (tuoByte[3] & 0x03) << 8) + tuoByte[4];
Ovviamente inverti l'indice degli interi se tu per "primo intero"
intendi quello in posizione meno significativa.

 intendi quello in posizione meno significativa.


         int int3 = ((bytes[4] & 0xff) << 2) | (bytes[3] & 0xff)>> 8;
Lo shift a destra non è di 8 ma di 6

 Lo shift a destra non è di 8 ma di 6
Hai ragione!
Colpa mia che ho fatto il test di unità solo per il primo e secondo byte.


	
http://mindprod.com/jgloss/unsigned.html
Sinceramente non ho mai capito l'inesistenza dei tipi unsigned...