Created
July 18, 2016 19:15
-
-
Save caelifer/53486265781a23e38631cda42f5622a5 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/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