Ho fatto esattamente come dici tu, almeno credo:Originariamente inviato da andbin
Quando fai il put deve essere little-endian, quando fai il get deve essere big-endian (o il contrario, tanto devi solo swappare). Little-endian lo imposti solo 1 volta prima del for!!!!
E poi scusa, perché fai un ByteBuffer di 9000 e nel for inserisci ogni volta all'offset 'i'??? Così fai un macello (oltre a sprecare memoria).
Vuoi swappare un double?? Bene, crea il tuo ByteBuffer lungo 8, poi ad ogni ciclo fai:
a) un clear() del ByteBuffer
b) un order(...) per impostare little-endian
c) il put del double
d) un order(...) per impostare big-endian
e) un get del double
Spendi anche solo 5 minuti del tuo tempo per capire meglio come funziona ByteBuffer!!
DataInputStream dis = new DataInputStream(new FileInputStream ("weights.dat"));
ByteBuffer bb = ByteBuffer.allocate(8);
for(int i=0;i<896.;i++)
{
bb.clear();
var=dis.readDouble();
bb.order(ByteOrder.LITTLE_ENDIAN).putDouble(var);
System.out.println(var +"__"+ bb.order(ByteOrder.BIG_ENDIAN).getDouble(0) +"__"+i);
}
E in output ho:
0.009182359616844394__3.2988478350696204E-120__0
-0.002138954759412613__-1.0002030903222078E291__1
0.005195382598750681__-1.3020882548998934E-28__2
4.819424459599818__1.732336501769424E15__3
5.058553871334569__-2.5247218293340496E-141__4
1.0871459521596347__1.2730424913726184E-221__5
-1.0868843071228302__8.841273238611073E-299__6
-0.0016712652843744874__-12.159056048998421__7
0.0012012366699741682__-1.2707150916632518E11__8
-0.001529889658280872__-7.596228970545135E118__9
2.295218951725268__5.60797856292581E-70__10
Grazie mille per il tuo aiuto, dimmi solo se reputi corretti gli output e se devo tornare ad allocare un Buffer come prima visto che dopo devo fare la seguente operazione, per riportare il file dei pesi originale (in little endian) in un file dei pesi in big endian:
FileChannel out = new FileOutputStream ("weightsOUT.dat").getChannel();
out.write (bb);
out.close ();