in reply to Converting bytes to floats
sub _read_binary { my ($fh) = @_; barf "bigfloat" unless(length(pack("f", 1)) == 4); # TODO try to read part name from header (up to \0) seek($fh, 80, 0); my $buf; read($fh, $buf, 4) or warn "EOF?"; my $triangles = unpack(' +L<', $buf); my $bytes = 50 * $triangles; # norm+3vertices * 3float + short with +length of extra my $bytespdl = zeroes PDL::byte(), 50, $triangles; my $bytesread = read($fh, ${$bytespdl->get_dataref}, $bytes); barf "Tried to read $bytes but only got $bytesread" if $bytesread != + $bytes; $bytespdl->upd_data; my $floatpdl = zeroes PDL::float(), 3, 4, $triangles; ${$floatpdl->get_dataref} = ${$bytespdl->slice('0:47')->get_dataref} +; $floatpdl->upd_data; $floatpdl->type->bswap->($floatpdl) if isbigendian(); # TODO check that the unit normal is within a thousandth of a radian # (0.001 rad is ~0.06deg) _as_ndarray($floatpdl->slice(':,1:3')); }
|
|---|