Newsgroup: it.comp.java
Titolo: Numeri senza segno

Ho bisogno di passare ad un file, uno per volta, i quattro byte che 
costuiscono una variabile di tipo int.
Non esistendo i tipi senza segno, ho qualche difficoltà... avevo provato 
come segue, ma il risultato non è corretto.
  private void inserisce_dword(int i)
   {
    byte i1= (byte) (i & 0xFF);
    byte i2= (byte) ((i & 0xFF00)/0x100);
    byte i3= (byte) ((i & 0xFF0000)/0x10000);
    byte i4= (byte) ((i & 0xFF000000)/0x1000000);
    inserisce_byte(i1);
    inserisce_byte(i2);
    inserisce_byte(i3);
    inserisce_byte(i4);
   }

 come segue, ma il risultato non è corretto.
Forse il tuo problema e' che in Java un int e' rappresentato in
2-complement.
Prova cosi':
    int i=0x01020304;
    byte b[] = new byte[4];
    b[0] = (byte)i;
    b[1] = (byte)(i >> 8);
    b[2] = (byte)(i >> 16);
    b[3] = (byte)(i >> 24);
    System.out.println(b[0]);
    System.out.println(b[1]);
    System.out.println(b[2]);
    System.out.println(b[3]);
-- 
Giambo - Occhio al filtro antispam _e_ alla whitelist !


Ho provato la tua soluzione... in realtà, sia la mia che la tua, se devo
scriver 0xFF, danno
correttamente -1... ma nel file non viene scritto 0xFF, bensì 0x3F! E
questo, per tutti i valori maggiori di 127 o minori di 0 per cui faccio il 
casting!
C'è modo di aggirare il problema, creando una
classe di numeri senza segno?

Provando le seguenti righe
for (int i=-10; i<11; i++) {FileBitmap.write(i);}
for (int i=126; i<132; i++) {FileBitmap.write(i);}
vedo che tutti i valori <0 o >127 di i provocano la scrittura di 0x3F, 
mentre negli altri casi viene correttamente scritto un singolo byte.
Il risultato č della scrittura su file č:
3F 3F 3F 3F 3F 3F 3F 3F  3F 3F 00 01 02 03 04 05
06 07 08 09 0A 7E 3F 3F   3F 3F 3F 



Forse la mia è un po' una bischerata, ma funziona. Per mia utilità personale
ho creato due funzioni in grado di estrarre/impostare un certo byte in un
long. Sembrano funzionare anche velocemente:
public static int getByte(long value, int pos) {
   return (int)((value & (0xFF << (8*pos))) >> (8*pos));
}
public static long setByte(long value, int pos, int bvalue) {
   return value | (((long)(bvalue)) << (8*((long)(pos))));
}
In entrambe le funzioni, "value" è il valore totale su cui lavorare, "pos" è
la posizione del byte (da 0 a 7, oltre va in overflow). "bvalue" è il nuovo
byte da impostare nel long.
Il valore del byte richiesto viene passato come int appunto per evitare
problemi di segno. Tra l'altro, in ogni specializzazione di OutputStream, il
metodo write() per singolo byte richiede proprio un int (e la corrispettiva
read() di InputStream restituisce un int).
Spero possa esserti utile.
-- 
Fermiamo Scientology prima che sia troppo tardi!!!
http://xenu.com-it.net
  ---  
http://www.xenu.net
(per rispondere personalmente leva IlDitoDalCulo)

 long.
In realtà ho verificato che la mia routine di separazione dei singoli byte 
funzionava correttamente... il problema è dopo, nell'istruzione:
FileWriter File1=new FileWriter(nome);
File1.write(dati_file[i]);
Sembra che, per qualche strano motivo, i valori non vengano passati come 
byte, e quindi, se il 7° bit è settato ad 1 (da 0x80 a 0xFF), viene salvato 
un punto interrogativo (0x3F='?') al suo posto. Ma è possibile che non si 
possa salvare un numero così com'è???? 

Poichè ho scoperto che il problema non erano i numeri senza segno, ma il 
metodo write della classe filewriter, inizio un nuovo thread ("Scrivere un 
file di dati (non di caratteri)", sul quale rispondere se siete in grado di 
aiutarmi. 

Risolto!
FileOutputStream FileBitmap=new FileOutputStream(nome+".bmp"); 

 FileWriter File1=new FileWriter(nome);
Un Writer serve a scrivere caratteri, quello che gli passi viene convertito
secondo l'encoding di default.
Per i dati usa DataOutputStream
Ciao
Matteo
-- 
chi sono e soprattutto chi non sono:
http://www.ilnomedeldominio.it
un piccolo programma per studenti universitari:
http://inutility.ilnomedeldominio.it/imsv/