Newsgroup: it.comp.www.php
Titolo: [Debuttante] Variabili tipizzate

Vorrei leggere e scrivere delle strutture C salvate in un file
binario.
In pratica in C potrei definere una struttura:
typedef {
  Int8 ch[8];
  Uns16 time;
  Double samples[8];
  Int16 code[4];
  Char description[20]
} Acq_Data;
e poi leggere semplicemente con un fread:
fread(&Acqisition, sizeof(Acq_Data), 50, File);
Io vorrei fare la stessa cosa in PHP in modo da poter usare gli stessi
file binari, ma elaborare subito i risultati via web; ma siccome ho
poca esperienza il fatto che le variabili non siano strettamente
tipizzate mi spiazza un po'. Come si dovrebbe fare secondo la
filosofia di un linguaggio come il PHP?
Naturalmente io riesco a leggere i dati che mi servono in PHP ma leggo
i dati byte a byte e poi faccio manualmente le operazioni necessarie
per avere le variabili che mi servono. Mi pare pero' un metodo
piuttosto rozzo, non vi pare? Mi insegnate a farlo meglio?
Grazie in anticipo per l'aiuto

 PHP?
Utilizza delle funzioni binary safe e fatti uno pseudo
parse/tokenizzatore basato sullo spazio occupato dalle singole
variabili del record.
-- 
I am what I am, I do what I can
L'uomo, conscio di sbagliare, persevera.

 Grazie in anticipo per l'aiuto
cmq ci mancano le variabili tipizzate, spero che le mettano per certe cose

filosofia di un linguaggio come il PHP?
Penso con unpack().
	$blob = fread($fp, $sizeof_Acq_Data);
	$struct = array(
		'c8ch',		// Int8 ch[8] = 8 signed chars di 8 bit
		'Stime',	// unsigned short 16 bit, LOCAL ENDIAN!!!
		'd8samples',	// double, qualsiasi cosa significhi...
		...
	);
	$format = implode('/', $struct);
	$Acq_Data = unpack($format, $blob);
Ora Acq_Data e' qualcosa come
	array(
		ch1	=> ...
		ch2	=> ...
		...
		ch8
		time
		samples1
		samples2
		...
		samples8
		...
	);
Controlla il manuale per pack e unpack, guarda bene le endianity, fai dei
test e rammenta che potrei aver preso una solennissimissima cantonata.
Leonardo avvisante
-- 
Avere studiato senza mettere in pratica e' inutile;
mettere in pratica senza avere studiato e' pericoloso.
                                                - Conphpucio

 con php5 funziona con il 4 nn va allo stesso modo
Sbaglio o quello che mi dici e' valido per un file di testo?

 test e rammenta che potrei aver preso una solennissimissima cantonata.
Io pensavo di scrivere una classe e dotarla di una funzione di
"impacchettamento/spacchettamento binario" (se e' il termine giusto),
potrebbe essere una soluzione praticabile?

 potrebbe essere una soluzione praticabile?
Ottima! 
In pratica realizzi un oggetto che ha la stessa struttura della classe, poi
definisci un metodo read() ed un metodo write() che effettuano (l'im|lo
s)pacchettamento. L'idea di Leonardo di utilizzare unpack per
l'implementazione e' la migliore, pero' indipendentemente da come realizzi
lettura e scrittura l'utilizzo di un oggettino semplifica parecchio le
cose.
-- 
nick: corine
L'ascia lascia la scia
it-alt.cultura.lingua.sardu: NG in sardo e varianti

potrebbe essere una soluzione praticabile?
Si', e molto pratica. La classe usera' pack e unpack e popola delle
variabili interne con i valori corretti, cosi' nel resto del codice
non ti devi preoccupare di niente.
Gli dai dei metodi tipo fopen, fread, fclose, fseek (ti servira') e
fwrite, e a quel punto sei a cavallo.
Leonardo


s)pacchettamento.
Uops. Sono arrivato secondo :-|
Leonardo lettore offline


 Leonardo lettore offline
Corine lettore assiduo, trooooppo assiduo :-/


 Leonardo lettore offline
Ringrazio entrambi e adesso provo a far funzionare il tutto.
Spero di poter contare ancora sul vostro aiuto per la prossima
versione o il prossimo problema.
A rileggerci.