Skip to content

Instantly share code, notes, and snippets.

@caelifer
Created July 18, 2016 19:15
Show Gist options
  • Save caelifer/53486265781a23e38631cda42f5622a5 to your computer and use it in GitHub Desktop.
Save caelifer/53486265781a23e38631cda42f5622a5 to your computer and use it in GitHub Desktop.
#!/usr/bin/env perl
use 5.010; # Required 5.10 or greater for 'Q' and 'q' in format string for pack/unpack
use warnings;
use strict;
use Config;
use Math::BigInt qw(:constant);
use Test::More tests => 4;
# Make sure system supports 64-bit integer
die "This Perl installation does not support 64bit integers"
unless $Config{use64bitint} eq 'define' and $Config{longsize} >= 8;
# Avoid portability warnings
no warnings 'portable';
# My test platform is little-endian
use integer;
my $testDataUnsigned = 0xDEADBEEFCAFEFADE; # 64-bit unsigned integer value
my $testDataSigned = -1234567890987654321; # 64-bit signed integer value
# To pack it in a Newtork bit order (big-endian)
my $packedBigEndianDataUnsigned = pack("Q>", $testDataUnsigned);
my $packedBigEndianDataSigned = pack("q>", $testDataSigned);
# Unpack in different order
my $convertedDataUnsigned = unpack("Q<", $packedBigEndianDataUnsigned);
my $convertedDataSigned = unpack("q<", $packedBigEndianDataSigned);
# Test LE to BE conversion and representation
is($convertedDataUnsigned, 0xDEFAFECAEFBEADDE,
sprintf("Conversion of unsigned 64-bit integer LE(Ox%X) -> BE(0x%X)", $testDataUnsigned, $convertedDataUnsigned)
);
is($convertedDataSigned, 5756606712126627310,
"Conversion of signed 64-bit integer LE($testDataSigned) -> BE($convertedDataSigned)");
# To unpack
my $unpackedUnsigned = unpack("Q>", $packedBigEndianDataUnsigned);
my $unpackedSigned = unpack("q>", $packedBigEndianDataSigned);
# Test unpack of BE data
ok($testDataUnsigned == $unpackedUnsigned,
sprintf("Match unsigned [0x%X == 0x%X]", $testDataUnsigned, $unpackedUnsigned)
);
ok($testDataSigned == $unpackedSigned,
"Match signed [$testDataSigned == $unpackedSigned]");
done_testing();
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment