Newsgroup: it.comp.lang.c
Titolo: ordine dei bit

ho eseguito un programma cosě:
 int arr[10]={0,1,2,3,4,5,6,7,8,9};
 FILE *fp=fopen("c:\\prova","wb+");
  fwrite(arr,sizeof(int),10,fp);
 fclose(fp);
poi apro il file con un editor esadecimale e guardo il primo intero(0): 00
00 00 00 tutto ok, ma poi vedo che il secondo intero (1) appare cosě: 01 00
00 00 Perchč non appare cosě 00 00 00 01, dato che č il bit piů basso che
vale 1?


perche' i byte sono ordinati dal meno al piu' significativo.
ciao.
g.

 other less alarmist word?
"screwed" -- Alexander Viro

 struttura su file e` scriverli come semplice testo".
Be', questo è forse un po' troppo draconiano.
Scriverli come semplice testo è sicuramente *un* modo per scriverli su file
in modo portabile (sebbene pure qui non manchino le difficoltà: in quale
charset? con quale convenzione per il fine riga? ecc.).
Ma ci sono altri modi. Ad esempio, si può scriverli e leggerli byte per
byte, in modo di essere certi della loro dimensione e della loro endianness:
int writeNumber (FILE * f, unsigned long n)
{
   int i;
   for (i = 1; i <= 4; i++)
   {
      if (putc((unsigned char)(n & 0xFF), f) == EOF)
         return ERR_IO;
      n >>= 8;
   }
   if (n != 0)
      return ERR_OVERFLOW;
   return OK;
}
int readNumber (FILE * f, unsigned long * pn)
{
   int i, c;
   unsigned long n = 0;
   for (i = 1; i <= 4; i++)
   {
      if ((c = getc(f)) == EOF)
         return ERR_IO;
      n |= ((unsigned char)c) & 0xFF;
      n <<= 8;
   }
   if (pn != NULL)
      *pn = n;
   return OK;
}
Oppure, si può scrivere nella "header" del file binario un numero
convenzionale come 0x01020304. Se, leggendo da un altro computer, nella
header troveremo invece 0x04030201, imposteremo una flag che ci dice di
"swappare" tutti i numeri contenuti nei record letti da quel momento in poi.
<OT>
Questa seconda tecnica è quella usata da Unicode per leggere e scrivere i
file UTF-16 e UTF-32 (cioè con codici carattere da 16 o 32 bit,
rispettivamente): il computer scrivente mette come primo carattere del file
di testo un carattere chiamato "byte order mark" (ma ufficialmente
"ZERO-WIDTH NO-BREAK SPACE", perché sarebbe un carattere di spaziatura a
larghezza zero) il cui codice è 0xFEFF. Se il computer leggente trova invece
il codice 0xFFFE (che in Unicode non esiste), tutti i caratteri letti da
quel momento in poi verranno "swappati".
</OT>
<OT_AL_QUADRATO>
Un po' di trivia informatica: ma lo sapevate che i termini "big endian" e
"little endian" sono presi dal romanzo "I viaggi di Gulliver" di J. Swift?
In una delle isole visitate dal protagonista c'erano continue guerra di
religione (satira delle ostilità fra cattolici e protestanti
nell'Inghilterra dell'epoca). La ragione delle ostilità era che, secondo la
religione dei "little endians", il guscio delle uova sode si doveva rompere
dalla parte più appuntita, mentre secondo i testi sacri dei "big endians" si
doveva rompere dalla parte più arrotondata. I due gruppi, ovviamente, si
consideravano reciprocamente eretici.
</OT_AL_QUADRATO>
--
Cingar
--------------------------------
Inviato via 
http://arianna.libero.it/usenet/

 "little endian" sono presi dal romanzo "I viaggi di Gulliver" di J. Swift?
Si`, letto da qualche parte. Forse sul Tanenbaum?
Luca
-- 
Home: 
http://kronoz.cjb.net
"Chi parla in tono cortese, ma continua a prepararsi, potra` andare avanti;
 chi parla in tono bellicoso e avanza rapidamente dovra` ritirarsi" 
Sun Tzu -- L'arte della guerra

 Si`, letto da qualche parte. Forse sul Tanenbaum?
Non saprei... A me l'ha raccontato un amico al bar. :-)


 Non saprei... A me l'ha raccontato un amico al bar. :-)
Istruitevi :-)
http://en.wikipedia.org/wiki/Endianess
C:\>iao Angelo
-- 
Posted via Mailgate.ORG Server - 
http://www.Mailgate.ORG

 "0xFF": a rendere il codice perfettamente portabile.
Si`, avevo parsato male quel ciclo.
Ora pero` questo file devo leggerlo su un PDP-10[1] dove la lunghezza del byte
e` arbitraria e su una macchina della Honeywell a 36bit. Come faccio? :D
Luca
[1] Si trova in giro una fantastica storia di ESR sui PDP-10.
-- 
Home: 
http://kronoz.cjb.net
"It is more complicated than you think"
                -- The Eighth Networking Truth from RFC 1925

 e` arbitraria e su una macchina della Honeywell a 36bit. Come faccio? :D
Non c'è problema: l'importante è che il byte sia *almeno* di 8 bit,
altrimenti un certo sistema potrebbe non essere in grado di leggere i numeri
scritti da un altro sistema.
