use Time::Local ; use Math::BigInt ; sub SysToHex { my ($sec,$min,$hour,$mday,$mon,$year)= @_ ; my $sectime = timegm($sec,$min,$hour,$mday,$mon,$year) ; my @hexReg1601 ; # Result # Conversion to intervals of 100 nanosecondes since 1970 my $secsystime = Math::BigInt -> new( $sectime ) ; my $nano100= Math::BigInt -> new(10000000) ; my$nanosecsys = $secsystime -> bmul ( $nano100 ) ; # 100 ns intervals since 1601 and 1970 # obtained within windows by manualy # entering the date 01/01/1970 my $hex1970 = '0x019DB1DED53E8000' ; my $nano1970 = X2I ( $hex1970 ) ; # Total number of 100ns intervals my $sec1601 = $nano1970 + $nanosecsys ; my $hex1601 = I2X ( $sec1601) ; # This coma separated format is expected by the registry my @liste1601 = split ( "", $hex1601 ) ; unshift (@liste1601, "0" ) unless ( @liste1601 % 2 == 0 ) ; while (@liste1601) { push ( @hexReg1601, splice ( @liste1601, -2 ), "," ) } pop @hexReg1601 ; # Gets rid of the last coma return join ( "", @hexReg1601 ) ; } sub X2I { my $n = shift; $n = '0' x (4 - (length($n) % 4)) . $n; my $m = Math::BigInt->new(0); while ( my $o = substr($n, 0, 4, '') ) { $m = $m * 65536 + hex $o; } $m; } sub I2X { my $i = shift; my $hex = ''; do { my $mod = $i % 16; $hex .= sprintf("%x", $mod); } while $i = $i / 16; scalar reverse $hex; }