J'ai un projet dans lequel une fonction reçoit quatre caractères de 8 bits et doit convertir le flottant IEEE-754 résultant de 32 bits en un nombre Perl normal. Il semble qu'il devrait y avoir un moyen plus rapide que le code de travail ci-dessous, mais je n'ai pas été en mesure de trouver une fonction de pack plus simple qui fonctionne.Comment puis-je convertir quatre caractères en un flottant IEEE-754 32 bits en Perl?
Il ne fonctionne pas, mais il semble que il est proche:
$float = unpack("f", pack("C4", @array[0..3]); # Fails for small numbers
Travaux:
@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));
Quelqu'un at-il une meilleure façon?
Je suis intriguée par le fait que votre extrait de code "ne fonctionne pas mais est proche" - pouvez-vous identifier les différences? Par exemple. en prenant le résultat de unpack() et en le convertissant aux 4 octets, puis en recherchant des bits qui sont différents entre l'entrée et la sortie finale? –