Tengo un proyecto en el que una función recibe cuatro caracteres de 8 bits y necesita convertir el flotador IEEE-754 resultante de 32 bits en un número Perl normal. Parece que debería haber una manera más rápida que el código de trabajo a continuación, pero no he podido encontrar una función de paquete más simple que funcione.¿Cómo puedo convertir cuatro caracteres en un flotador IEEE-754 de 32 bits en Perl?
no funciona, pero parece que está cerca:
$float = unpack("f", pack("C4", @array[0..3]); # Fails for small numbers
Obras:
@bits0 = split('', unpack("B8", pack("C", shift)));
@bits1 = split('', unpack("B8", pack("C", shift)));
@bits2 = split('', unpack("B8", pack("C", shift)));
@bits3 = split('', unpack("B8", pack("C", shift)));
push @bits, @bits3, @bits2, @bits1, @bits0;
$mantbit = shift(@bits);
$mantsign = $mantbit ? -1 : 1;
$exp = ord(pack("B8", join("",@bits[0..7])));
splice(@bits, 0, 8);
# Convert fractional float to decimal
for (my $i = 0; $i < 23; $i++) {
$f = $bits[$i] * 2 ** (-1 * ($i + 1));
$mant += $f;
}
$float = $mantsign * (1 + $mant) * (2 ** ($exp - 127));
Alguien tiene una mejor manera?
Me intriga que su fragmento superior "no funcione pero esté cerca": ¿puede identificar las diferencias? P.ej. tomando el resultado de unpack() y convirtiéndolo nuevamente a los 4 bytes, y luego buscando bits que sean diferentes entre la entrada y la salida final? –