• Publicidad

post y espacios en blanco

¿Apenas comienzas con Perl? En este foro podrás encontrar y hacer preguntas básicas de Perl con respuestas aptas a tu nivel.

post y espacios en blanco

Notapor daaran » 2009-05-27 14:33 @648

Buenas, estoy tratando de hacer lo siguiente:

Recojo de una webcam una matriz de colores que son los píxeles de la imagen.

Mi idea es enviar al Perl una cadena que contenga la cabecera de un BMP y los valores de los píxeles, para que cree "imagen.bmp", en hexadecimal.

Si le envío los valores en ascii, no me reconoce los espacios en blanco.

El problema es que en la cabecera hay bytes 0 y Perl no me los reconoce, y me los suprime o me sale el 0x20, al escribir el bmp.

Quiero enviar
Código: Seleccionar todo
42 4D 00 00 00 00 36 ...   BM____6
, pero directamente me sale BM6.

Gracias.
daaran
Perlero nuevo
Perlero nuevo
 
Mensajes: 6
Registrado: 2009-05-27 14:17 @636

Publicidad

Notapor explorer » 2009-05-27 14:50 @660

Bienvenido a los foros de Perl en Español, daaran.

Sería deseable ver algo del código que has preparado...
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14486
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Notapor daaran » 2009-05-27 16:34 @732

Hola. Claro, disculpa.

Esta parte es la que recoge los datos de la cabecera del bmp. El lenguaje es en ActionScript 2 de Flash:

Sintáxis: [ Descargar ] [ Ocultar ]
Using actionscript Syntax Highlighting
pixelesCabecera = new Array(
                                                "0x42","0x4d",
                                                "0x0","0x0","0x0","0x0",
                                                "0x00","0x00","0x00","0x00",
                                                "0x36","0x00","0x00","0x00",
                                                "0x28","0x00","0x00","0x00",
                                                "0x58","0x01","0x00","0x00",
                                                "0x58","0x01","0x00","0x00",
                                                "0x01","0x00",
                                                "0x18","0x00","0x00","0x00",
                                                "0x00","0x00","0x00","0x00",
                                                "0x00","0x00",
                                                "0x12","0x0b","0x00","0x00",
                                                "0x12","0x0b","0x00","0x00",
                                                "0x00","0x00","0x00","0x00",
                                                "0x00","0x00","0x00","0x00"
                                                );
       
        for(i=0;i<=pixelesCabecera.length-1;i++)
        {
                letra=String.fromCharCode(pixelesCabecera<span style="font-style: italic">)
                mensaje = mensaje + letra
        }
Coloreado en 0.008 segundos, usando GeSHi 1.0.8.4

El [i]array con los valores en hexadecimal con los metadatos de la cabecera; luego en un bucle pasa cada valor a char. Y los mete en la cadena. ¡Ahí ya me omite los valores 00!

Me tracea esto
Código: Seleccionar todo
BM6(XX 


Sintáxis: [ Descargar ] [ Ocultar ]
Using actionscript Syntax Highlighting
lv.imagen =  mensaje
lv.send("http://xxxxxxxxxxxx/cogeImagen.cgi", "_blank", "POST");
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4


Todo va en una cadena que es lo que envío como imagen=mensaje con post

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
//------------------------ perl

#!c:\Archivos de programa\perl\bin\perl
print "Content-type: text/html\n\n";

my $buffer; #inicializa contenedor

my %Variables; #inicializa el hash

#Lee el Standard input
read(STDIN, $buffer, $ENV{'CONTENT_LENGTH'});

       
         $marca = index($buffer,"=");
       
         $info = substr($buffer,$marca+1);
         
       
        open(F, ">imagen.bmp");
       
    print F $info;
       
        close(F);
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4


Copia en buffer a partir del igual, y eso es lo que pasa al fichero y esto es lo que me guarda:

Código: Seleccionar todo
BM6%28X%01X%01%01%18%12%0B%12%0B


Otra que he probado era enviar directamente una cadena :

Sintáxis: [ Descargar ] [ Ocultar ]
Using actionscript Syntax Highlighting
imagen=424D00000036..
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4
pero luego me guardaba el hex de esos valores.

Ando un poco perdido.

Espero haberme explicado bien, Si se les ocurre algo... muchas gracias.
daaran
Perlero nuevo
Perlero nuevo
 
Mensajes: 6
Registrado: 2009-05-27 14:17 @636

Notapor explorer » 2009-05-27 17:58 @790

Si la imagen la estás enviado con POST, y si se está indicando un tipo MIME application/x-www-form-urlencoded ni multipart/form-data, entonces puedes hacer esto para recogerla (no probado):

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
#!c:\Archivos de programa\perl\bin\perl
use CGI ':standard';

my $imagen = param('POSTDATA');

open    F, ">imagen.bmp";
binmode F;
print   F $imagen;
close   F;

print header();
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4
Eso sí, son todos los datos en crudo enviados por POST. Ahora mismo no sé decirte si necesitarás quitar algún tipo de cabecera.

Lo importante es, luego, indicar el binmode() para decir que vamos a grabar algo en modo binario.

Si se usan alguno de los MIME indicados antes, entonces la imagen llegará como un valor de un campo de formulario normal, que es lo que me parece que recibes, porque veo que estás buscando el carácter '=' para quedarte con lo demás.

En ese caso, sustituye 'POSTDATA' por el nombre de la variable (lo que está delante del '='). CGI se encargará de traducir los datos que estás recibiendo en hexadecimal a datos binarios, y luego en el programa, lo grabamos así.
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14486
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Notapor daaran » 2009-05-28 02:20 @138

buenas, muchas gracias ante todo, me ha ido muy bien.
Sin embargo aun no funciona del todo.
De momento estoy probando a enviar solo la cabecera.

1.-esto es lo que me tiene que aparecer

42 4D 00 00 00 00 00 00 00 00 36 00 00 00 28 00
00 00 58 01 00 00 00 01 00 00 01 00 18 00 00 00
00 00 00 00 00 00 12 0B 00 00 12 0B 00 00 00 00
00 00 00 00 00


Con lo que me dijiste funciona bien
Envío char( 0x42) y escribo "B",

2.-pero al enviar 0x00 , nulo , me guarda:

42 4D 36 28 58 01 01 01 18 12 0B 12 0B
o sea que no mete 00 sino que lo omite

3.-pero al enviar 0x01 , me guarda:

42 4D 01 01 01 01 01 01 01 01 36 01 01 01 28 01
01 01 58 01 01 01 01 01 01 01 01 01 18 01 01 01
01 01 01 01 01 01 12 0B 01 01 12 0B 01 01 01 01
01 01 01 01 00


Imagen
así esta mejor, pero no se reconoce la imagen bmp, esos bytes tienen que ser 0 y no 1, al menos eso creo.

y podriais decirme algun sitio donde explique lo de
MIME application/x-www-form-urlencoded y multipart/form-data


gracias otra vez
Última edición por daaran el 2009-05-28 02:36 @150, editado 1 vez en total
daaran
Perlero nuevo
Perlero nuevo
 
Mensajes: 6
Registrado: 2009-05-27 14:17 @636

Notapor explorer » 2009-05-28 02:28 @145

Pues, qué extraño... a mí sí que me funciona:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
#!/usr/bin/perl
use strict;
use warnings;
use diagnostics;

my @imagen = (
    0x42,0x4d,
    0x0,0x0,0x0,0x0,
    0x00,0x00,0x00,0x00,
    0x36,0x00,0x00,0x00,
    0x28,0x00,0x00,0x00,
    0x58,0x01,0x00,0x00,
    0x58,0x01,0x00,0x00,
    0x01,0x00,
    0x18,0x00,0x00,0x00,
    0x00,0x00,0x00,0x00,
    0x00,0x00,
    0x12,0x0b,0x00,0x00,
    0x12,0x0b,0x00,0x00,
    0x00,0x00,0x00,0x00,
    0x00,0x00,0x00,0x00
);

my $imagen = join '', map { chr } @imagen;

open    BMP, ">imagen.bmp";
binmode BMP;
print   BMP $imagen;
close   BMP;
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

Sale:
Código: Seleccionar todo
explorer@joaquin:~/Documents/Desarrollo> hexdump -C imagen.bmp
00000000  42 4d 00 00 00 00 00 00  00 00 36 00 00 00 28 00  |BM........6...(.|
00000010  00 00 58 01 00 00 58 01  00 00 01 00 18 00 00 00  |..X...X.........|
00000020  00 00 00 00 00 00 12 0b  00 00 12 0b 00 00 00 00  |................|
00000030  00 00 00 00 00 00                                 |......|
00000036
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14486
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Notapor daaran » 2009-05-28 04:00 @208

Hola otra vez.

Por lo que probado el problema me lo da ActionScript que no me saca el 0x00.

He probado a enviar esto:

imagen="\x42\x00\x42"

y en Perl
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
my $imagen = param('imagen');
$a = $imagen;

print "a: ", unpack('H*', $a), "\n";
open    F, ">imagen.bmp";
binmode F;
print   F $a;
close   F;

print header();

print $a;
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


y nanai. Me imprime BB y no B_B.

Había pensado en enviar una cadena : "424B000000036.."
y luego en Perl cortar los pares "42","4B" y pasarlos a hexadecimal, ¿es posible?

O quizás sustituir antes de enviar 0x00 por otro valor 0x13, o así... y luego Perl lo vuelva a pasar a 0x00. pero me da miedo que coincida con algún valor de la imagen (tamaño o color) y se fastidie el archivo.

El caso es que en C, sí que he podido generar imágenes.

Lo bueno del ActionScript es que me da acceso a la webcam, pero me falla en ese aspecto, y no he encontrado ayuda en foros de ActionScript.


Como ven, no tengo mucha idea de Perl :oops:

Muchas gracias
daaran
Perlero nuevo
Perlero nuevo
 
Mensajes: 6
Registrado: 2009-05-27 14:17 @636

Notapor explorer » 2009-05-28 08:43 @405

Ten en cuenta una cosa... no es lo mismo que hagas un print() que guardar información en un fichero binario: si sacas ceros por la salida estándar, no los verás, porque no coinciden con ningún carácter imprimible.

Debes siempre sacar los datos binarios a un fichero, y luego hacer el hexdump para ver su contenido. O usar alguno de los módulos que hace ese tipo de salidas... pero NO uses print() para salidas binarias hacia la consola.
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14486
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Notapor daaran » 2009-05-28 14:25 @642

Bueno, al final he hecho un apaño y parece que funciona, ahí va:

en la aplicación de la webcam cojo los valores en hexadecimal y los
envío por post en decimal:

imagen=42,40,0,0,0,0,6...

Luego en Perl
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
#!c:\Archivos de programa\perl\bin\perl
use CGI ':standard';

my $imagen = param('imagen');
print header();

my @lista = split(",",$imagen);

my $elementos = $#lista ;
print $elementos;

for(my $i=0;$i<=$elementos-1;$i++){

             if($lista[$i]== 0)
             {
                         $lista[$i]="\x";
              }
              else
              {
                          $lista[$i]= chr( $lista[$i] );
               }
       
       
}
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


Como no me hacía caso al 0x00, al final envío el número en decimal.
Y mira uno a uno, de manera que cuando sea "0", lo sustituye por '\x'.

Si no, sustituye el elemento del array por el ascii de ese valor.

luego guarda @lista en el fichero .bmp

Como sabemos la posición de los metadatos de la cabecera en el array, podríamos modificar el bmp, para recortar la imagen, por ejemplo, o saber el tamaño final, etc..

Mil gracias.
daaran
Perlero nuevo
Perlero nuevo
 
Mensajes: 6
Registrado: 2009-05-27 14:17 @636

Notapor explorer » 2009-05-28 15:51 @702

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
#!/usr/bin/perl
use strict;
use warnings;
use diagnostics;

my $imagen =
    '66,77,'
  . '0,0,0,0,'
  . '0,0,0,0,'
  . '54,0,0,0,'
  . '40,0,0,0,'
  . '88,1,0,0,'
  . '88,1,0,0,'
  . '1,0,'
  . '24,0,0,0,'
  . '0,0,0,0,'
  . '0,0,'
  . '18,11,0,0,'
  . '18,11,0,0,'
  . '0,0,0,0,'
  . '0,0,0,0'
;

$imagen = join '', map { chr } split ',', $imagen;

open    BMP, ">imagen.bmp";
binmode BMP;
print   BMP $imagen;
close   BMP;
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4
Vuelve a salir lo mismo que antes:
Código: Seleccionar todo
explorer@portatil:~/Documents/Desarrollo> hexdump -C imagen.bmp
00000000  42 4d 00 00 00 00 00 00  00 00 36 00 00 00 28 00  |BM........6...(.|
00000010  00 00 58 01 00 00 58 01  00 00 01 00 18 00 00 00  |..X...X.........|
00000020  00 00 00 00 00 00 12 0b  00 00 12 0b 00 00 00 00  |................|
00000030  00 00 00 00 00 00                                 |......|
00000036


Aplicando la función chr() a todos los caracteres, sí funciona. En este caso, suponemos que nos están enviado los bytes en formato decimal y separado por comas.

La única explicación que se me ocurre a todo este lío es que en el ActionScript no está enviando la imagen en formato binario.

Lo ideal sería ver las cabeceras HTTP que activan el perl.
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14486
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Siguiente

Volver a Básico

¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 1 invitado

cron