Ah... Det är här det roliga börjar... :-)
Man bör ha en metod som heter getSize() som returnerar antalet bytes man behöver för att fylla bufferten. Annars finns risken att man gör bort sig...
Det som är lite knepigt är att få reda på hur många bitar som används för varje typ. Se http://java.sun.com/docs/books/tutorial/java/nutsandbolts/datatypes.html.
ByteBuffer.putInt(int i) skriver 4 bytes och en byte är 8 bits.
En int är alltså 32 bitar lång.
Om man då kikar på din kod så borde bitmönstret på din maskin, som jag gör ett antagande är en 32-bitars och inte en 16 eller 64 bitarsmaskin, se ut såhär. jag har valt att gör det i byterader (8-bitarsrader.) Detta om det är BIG_ENDIAN (Största värdesiffran först).
bit 1 2 3 4 5 6 7 8
--------------------------------
byte
0 0 0 0 0 0 0 0 0
1 0 0 0 0 0 0 0 0
2 0 0 0 0 0 0 0 0
3 0 0 0 0 0 0 0 0 (0)
-
4 0 0 0 0 0 0 0 0
5 0 0 0 0 0 0 0 0
6 0 0 0 0 0 0 0 0
7 0 0 1 1 0 1 1 1 (55)
-
8 0 0 0 0 0 0 0 0
9 0 0 0 0 0 0 0 0
10 0 0 0 0 0 0 0 0
11 0 0 0 0 0 1 0 1 (5)
-
12 0 0 0 0 0 0 0 0
13 0 0 0 0 0 0 0 0
14 0 0 0 0 0 0 0 0
15 0 0 1 0 1 1 0 1 (45)
---
16 ???
17 ???
18 ???
när jag läser ut detta i en forloop får jag detta. Jag har skrivit raderna inom parentes.
0 (0-4)
0 (1-5)
0 (2-6)
0 (3-7)
55 (4-8)
14080 (5-9)
3604480 (6-10)
922746880 (7-11)
4 (8-12)
1024 (9-13)
262144 (10-14)
67108864 (11-15)
45 (12-16)
11520 (13-17)
2949120 (14-18)
Vad din for-loop gör är alltså att först läsa från rad 0 och 4 bytes och skriva ut detta (0) sedan från rad 1 och 4 bytes och skriva ut detta (0)... Vid rad 4 läser den 4 bytes och skriver ut 55.
Vid rad 5 läser den ut
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 1 1 1 0 0 0 0 0 0 0 0
som mycket riktigt blir 14080.
Native för Windows 2000 är LITTLE_ENDIAN, alltså minsta värdesiffran först och då blir bitmönstret att se ut såhär:
bit 1 2 3 4 5 6 7 8
--------------------------------
byte
0 0 0 0 0 0 0 0 0 (0)
1 0 0 0 0 0 0 0 0
2 0 0 0 0 0 0 0 0
3 0 0 0 0 0 0 0 0
-
4 0 0 1 1 0 1 1 1 (55)
5 0 0 0 0 0 0 0 0
6 0 0 0 0 0 0 0 0
7 0 0 0 0 0 0 0 0
-
8 0 0 0 0 0 1 0 1 (5)
9 0 0 0 0 0 0 0 0
10 0 0 0 0 0 0 0 0
11 0 0 0 0 0 0 0 0
-
12 0 0 1 0 1 1 0 1 (45)
13 0 0 0 0 0 0 0 0
14 0 0 0 0 0 0 0 0
15 0 0 0 0 0 0 0 0
och utskriften:
0 (0-4)
922746880 (1-5)
3604480 (2-6)
14080 (3-7)
55 (4-8)
67108864 (5-9)
262144 (6-10)
1024 (7-11)
4 (8-12)
754974720 (9-13)
2949120 (10-14)
11520 (11-15)
45 (12-16)
0 (13-17)
0 (14-18)
Av din utskrift kan jag alltså sluta mig till att du använder BIG_ENDIAN.
Frågan är nu då hur du läser in detta på mottagarsidan???
Det är här det blir liiiiite knepigt... Risken finns att en integer inte representeras på detta sätt på C-sidan... Det gäller att veta hur många bitar man ska läsa av varje typ... Eller hur många man ska skriva...
Blir det något klarare?
En jättebra sak är att titta på ByteBufferten som man gjort eller tagit emot i en debugger.