Página 1 de 1

Desempaqueta especial

NotaPublicado: 2006-01-14 07:23 @349
por explorer
Buenas...
Un amigo me pregunta cómo es posible usar la función unpack para sacar un valor "network" (32 bits big-endian) pero CON signo ("signed").
Ya lo ha resuelto leyendo un network normal y luego haciendo la típica resta. Pero la pregunta es si es posible hacerlo diréctamente con la función unpack.

Re: Desempaqueta especial

NotaPublicado: 2006-01-14 07:58 @374
por explorer
Me respondo a mi mismo... encontré una solución:
Código: Seleccionar todo
$val=unpack("N",$raw^"\x80\0\0\0")-(1<<31)

http://www.perlmonks.org/index.pl?node_id=176216

NotaPublicado: 2006-01-15 13:19 @597
por Perl user
De todos modos no es una solución directa con pack/unpack, el problema es que al ser débilmente tipificado, las expresiones con/sin signo son diferente de trabajar en Perl.

Y nuevamente, las cuestiones de red siempre son dependientes de la plataforma de trabajo, normalmente se recomienda trabajar con funciones a mas bajo nivel que Perl, es decir funciones directas de BSD sockets. inet_aton podría funcionarte mejor para transformar cadenas ASCII a Network Long.

Saludos,

Re: Desempaqueta especial

NotaPublicado: 2006-01-15 13:40 @611
por explorer
Si, de acuerdo... pero este es un caso muy especial... hay que manejar direcciones network, pero no vamos a realizar ningún tipo de tráfico de datos.
Es más una cuestión sobre enrutado.

NotaPublicado: 2006-01-15 13:42 @612
por Perl user
Y no has pensado mejor hacerlo en C? definitivamente mucho mejor. :P

Preferiría raw sockets para esos casos...

Saludos,