Bandwidth matters a lot in this case, so I'd like to "compress" the data by converting numbers from string representation given by unpack() to numerical values.
I really don't understand this part. Normally unpack is used after the data is received from the network. And to compress the data function pack is used. Why do you need to convert strings to numbers?
Normally, if I want to send over network something in compact form I simply use pack. Example
my $one = "1234";
my $two = 1234;
my $d = pack("nn", $one, $two);
# See the size of packed data (it is 4 bytes).
print length($d), "\n";
# See that both string and number are packed the same way.
print unpack("H*", $d), "\n";