[Linuxtrent] Re: semiOT-domanda su fwrite per programmatori C

  • From: Matteo Perini <pepeyomat@xxxxxxxxx>
  • To: linuxtrent@xxxxxxxxxxxxx
  • Date: Thu, 07 Feb 2013 16:04:20 +0100

Il 07/02/2013 12:01, Flavio Stanchina ha scritto:
Matteo Perini wrote:
Ho un piccolo script in c++ per prendere dei frame da una camera firewire.

Se è in C++, non è uno script. A meno che tu non abbia un ambiente C++ interpretato... :p

Ok... diciamo programmino allora... ;)

ad un certo punto vorrei passare l'immagine sullo stdout dello script e
lo faccio con:

fwrite(frame->image, 1ype is the superclass for str <http://docs.python.org/2/library/functions.html#str> and unicode <http://docs.python.org/2/library/functions.html#unicode>. It cannot be call, HEIGHT*WIDTH, stdout);

Sicuro che i dati siano raw, 1 byte per pixel? Non sono compressi e/o codificati in qualche modo?

Non sono sicuro al 100% ma non so come controllare.
I dati provengono da una camera firewire e vengono letti con la libreria dc1394 (verosimilmente sono in formato raw). Anche i dati delle immagini che riesco a prelevare me lo confermano, infatti se salvo in formato tiff ho una dimensione di 5 Mb per un immagine di 5 MPx (un byte per pixel).

il tutto funziona bene finchè non ho dei pixel con valore esadecimale
'X00'.

fwrite() non interpreta i byte a zero in modo speciale, quindi non è quello il problema. Casomai lo fa chi legge i dati in uscita, ed infatti sarebbe opportuno che ci spieghi come maneggi l'output del tuo programma.

In effetti grazie anche ai vostri consigli temo che sia python che interpreta male il flusso di dati che gli arrivano.... sorry.

In quel caso infatti la trasmissione sullo stdout sembra terminare prima
di aver trasmesso tutti i dati.

In C/C++, un byte a 0 è per convenzione il terminatore delle stringhe (intese come array di caratteri, da non confondere con gli oggetti std::string del C++). Non c'entra Linux, ed in ogni caso qui non parliamo di stringhe quindi è irrilevante.

Se non ho detto fesserie c'è un modo per evitare che questo avvenga?

Ho pensato di trasmettere i dati in modo diverso (anche se non so ancora
come), oppure di dire allo stdout di non "leggere" gli X00 come fine riga.

Invece di usare lo stdout, apri un file in modalità binaria e scrivi in quello: non dovrebbe cambiare nulla, ma così ti togli il dubbio. Peraltro, se hai ridiretto l'output con

  programma > file.out
Ci sto provando...

non ci sono differenze pratiche, visto che i sistemi operativi Unix-like non fanno distinzione tra file di testo e file binari.

Il problema è, secondo me, o nei dati di input che non sono fatti come pensi tu, o nell'elaborazione dell'output che usa funzioni di manipolazione stringhe su dati binari.

Attualmente sto leggendo lo stdout con python col comando commands.getoutput('comando') Mi era comodo come metodo ma non ho pensato che l'input potesse essere interpretato male. Proverò a salvare in un file temporaneo per poi andare a leggerlo con python...

Grazie a tutti dei consigli e scusate se non ho risposto prontamente...
Farò un po' di prove e vi farò sapere.

Other related posts: