Mercurial > repos > deepakjadmin > mayatool3_test2
diff lib/ConversionsUtil.pm @ 0:4816e4a8ae95 draft default tip
Uploaded
author | deepakjadmin |
---|---|
date | Wed, 20 Jan 2016 09:23:18 -0500 |
parents | |
children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/lib/ConversionsUtil.pm Wed Jan 20 09:23:18 2016 -0500 @@ -0,0 +1,344 @@ +package ConversionsUtil; +# +# $RCSfile: ConversionsUtil.pm,v $ +# $Date: 2015/02/28 20:47:02 $ +# $Revision: 1.22 $ +# +# Author: Manish Sud <msud@san.rr.com> +# +# Copyright (C) 2015 Manish Sud. All rights reserved. +# +# This file is part of MayaChemTools. +# +# MayaChemTools is free software; you can redistribute it and/or modify it under +# the terms of the GNU Lesser General Public License as published by the Free +# Software Foundation; either version 3 of the License, or (at your option) any +# later version. +# +# MayaChemTools is distributed in the hope that it will be useful, but without +# any warranty; without even the implied warranty of merchantability of fitness +# for a particular purpose. See the GNU Lesser General Public License for more +# details. +# +# You should have received a copy of the GNU Lesser General Public License +# along with MayaChemTools; if not, see <http://www.gnu.org/licenses/> or +# write to the Free Software Foundation Inc., 59 Temple Place, Suite 330, +# Boston, MA, 02111-1307, USA. +# + +use strict; +use Exporter; +use Constants; + +use vars qw(@ISA @EXPORT @EXPORT_OK %EXPORT_TAGS); + +@ISA = qw(Exporter); + +# Groups of conversion functions... +my(@MathConversions) = qw(DegreesToRadians RadiansToDegrees); +my(@NumericBaseConversions) = qw(BinaryToDecimal DecimalToBinary HexadecimalToDecimal DecimalToHexadecimal OctalToDecimal DecimalToOctal BinaryToHexadecimal HexadecimalToBinary HexadecimalToOctal OctalToHexadecimal StringToBinary StringToHexadecimal); + +# Export all conversion functions... +@EXPORT = (@MathConversions, @NumericBaseConversions); +@EXPORT_OK = qw(); + +%EXPORT_TAGS = ( + math => [@MathConversions], + all => [@EXPORT, @EXPORT_OK] + ); + + +# Degrees to radians... +sub DegreesToRadians ($;$) { + my($Degrees, $IgnoreWrap) = @_; + my($Radians, $WrapValue); + + $WrapValue = (defined($IgnoreWrap) && $IgnoreWrap) ? 0 : 1; + if ($Degrees > 360 && $WrapValue) { + $Degrees = $Degrees % 360; + } + $Radians = ($Degrees * TwoPi) / 360; + + return $Radians; +} + +# Radians to degrees... +sub RadiansToDegrees ($;$) { + my($Radians, $IgnoreWrap) = @_; + my($Degrees, $WrapValue); + + $WrapValue = (defined($IgnoreWrap) && $IgnoreWrap) ? 0 : 1; + $Degrees = ($Radians * 360) / TwoPi; + if ($Degrees > 360 && $WrapValue) { + $Degrees = $Degrees % 360; + } + + return $Degrees; +} + +# Convert a binary string to a decimal number... +sub BinaryToDecimal ($) { + my($Value) = @_; + + if ($Value !~ /^0b/) { + $Value = "0b${Value}"; + } + return _ConvertToDecimal($Value); +} + +# Convert a decimal number into a binary string... +sub DecimalToBinary ($) { + my($Value) = @_; + + return sprintf("%b", $Value); +} + +# Convert a hexadecimal string to a decimal number... +sub HexadecimalToDecimal ($) { + my($Value) = @_; + + if ($Value !~ /^0x/) { + $Value = "0x${Value}"; + } + return _ConvertToDecimal($Value); +} + +# Convert a decimal number into a hexadecimal string... +sub DecimalToHexadecimal ($) { + my($Value) = @_; + + return sprintf("%x", $Value); +} + +# Convert an octal string to a decimal number... +sub OctalToDecimal ($) { + my($Value) = @_; + + if ($Value !~ /^0/) { + $Value = "0${Value}"; + } + return _ConvertToDecimal($Value); +} + +# Convert a decimal number into an octal string... +sub DecimalToOctal ($) { + my($Value) = @_; + + return sprintf("%o", $Value); +} + +# Convert string into a binary string. Going from left to right, two ways of arranging bits +# inside each byte are available: Most Significat Bits (MSB) first or Least Significat Bits (LSB) +# first. Default is MSB corresponding to descending bits order (PerlSpeak) inside each +# each packed byte (Most singificat bits first). +# +sub StringToBinary ($;$) { + my($Value, $UseReverseBitOrder) = @_; + my($BinTemplate); + + $BinTemplate = (defined($UseReverseBitOrder) && $UseReverseBitOrder) ? 'b*' : 'B*'; + return unpack($BinTemplate, $Value); +} + +# Convert string into a hexadecimal string. Two ways of arranging nybbles (pair of 4 bits in each +# byte) are available: high nybbles first or low nybbles first. Default is MSB corresponding to high +# nybbles (PerlSpeak) first. Low and high nybbles correspond to pair of a low and high four bits in a byte. +# +sub StringToHexadecimal ($;$) { + my($Value, $UseReverseBitOrder) = @_; + my($HexTemplate); + + $HexTemplate = (defined($UseReverseBitOrder) && $UseReverseBitOrder) ? 'h*' : 'H*'; + return unpack($HexTemplate, $Value); +} + +# Convert a binary string into a hexadecimal string... +# +sub BinaryToHexadecimal ($;$) { + my($Value, $UseReverseBitOrder) = @_; + my($BinTemplate, $HexTemplate); + + $BinTemplate = (defined($UseReverseBitOrder) && $UseReverseBitOrder) ? 'b*' : 'B*'; + $HexTemplate = (defined($UseReverseBitOrder) && $UseReverseBitOrder) ? 'h*' : 'H*'; + + return unpack($HexTemplate, pack($BinTemplate, $Value)); +} + +# Convert a hexadecimal string into a binary string... +# +sub HexadecimalToBinary ($;$) { + my($Value, $UseReverseBitOrder) = @_; + my($BinTemplate, $HexTemplate); + + $BinTemplate = (defined($UseReverseBitOrder) && $UseReverseBitOrder) ? 'b*' : 'B*'; + $HexTemplate = (defined($UseReverseBitOrder) && $UseReverseBitOrder) ? 'h*' : 'H*'; + + return unpack($BinTemplate, pack($HexTemplate, $Value)); +} + +# Convert a hexadecimal string into a octal string... +# +sub HexadecimalToOctal { + my($Hexadecimal) = @_; + + return DecimalToOctal(HexadecimalToDecimal($Hexadecimal)); +} + +# Convert a octal string into a hexadecimal string... +# +sub OctalToHexadecimal { + my($Octal) = @_; + + return DecimalToHexadecimal(OctalToDecimal($Octal)); +} + +# Use Perl oct function to convert binary, octal or hexadecimal strings into decimal numbers. +sub _ConvertToDecimal ($) { + my($Value) = @_; + + return ($Value =~ /^0/) ? oct($Value) : $Value; +} + +1; + +__END__ + +=head1 NAME + +ConversionsUtil + +=head1 SYNOPSIS + +use ConversionsUtil; + +use ConversionsUtil qw(:math); + +use ConversionsUtil qw(:all); + +=head1 DESCRIPTION + +B<ConversionsUtil> module provides the following functions: + +BinaryToDecimal, BinaryToHexadecimal, DecimalToBinary, DecimalToHexadecimal, +DecimalToOctal, DegreesToRadians, HexadecimalToBinary, HexadecimalToDecimal, +HexadecimalToOctal, OctalToDecimal, OctalToHexadecimal, RadiansToDegrees, +StringToBinary, StringToHexadecimal + +=head2 FUNCTIONS + +=over 4 + +=item B<BinaryToDecimal> + + $Decimal = BinaryToDecimal($Binary); + +Converts a I<Binary> string to B<Decimal> string. + +=item B<BinaryToHexadecimal> + + $Hexadecimal = BinaryToHexadecimal($Binary); + +Converts a I<Binary> string to B<Hexadecimal> string. + +=item B<DecimalToBinary> + + $Binary = DecimalToBinary($Decimal); + +Converts a I<Decimal> string to B<Binary> string. + +=item B<DecimalToHexadecimal> + + $Hexadecimal = DecimalToHexadecimal($Decimal); + +Converts a I<Decimal> string to B<Hexadecimal> string. + +=item B<DecimalToOctal> + + $Octal = DecimalToOctal($Decimal); + +Converts a I<Decimal> string to B<Octal> string. + +=item B<DegreesToRadians> + + $Radians = DegreesToRadians($Degrees, [$DoNotWrapValue]); + +Converts degrees to radians in the range from 0 to 2PI or to corresponding radians without +wrapping the converted value to 0 to 2PI. Default is to wrap the converted value. + +=item B<HexadecimalToBinary> + + $Binary = HexadecimalToBinary($Hexadecimal); + +Converts a I<Hexadecimal> string to B<Binary> string. + +=item B<HexadecimalToDecimal> + + $Decimal = HexadecimalToDecimal($Hexadecimal); + +Converts a I<Hexadecimal> string to B<Decimal> string. + +=item B<HexadecimalToOctal> + + $Octal = HexadecimalToOctal($Hexadecimal); + +Converts a I<Hexadecimal> string to B<Octal> string. + +=item B<OctalToDecimal> + + $Decimal = OctalToDecimal($Octal); + +Converts a I<Octal> string to B<Decimal> string. + +=item B<OctalToHexadecimal> + + $Hexadecimal = OctalToHexadecimal($Octal); + +Converts a I<Octal> string to B<Hexadecimal> string. + +=item B<RadiansToDegrees> + + $Degrees = RadiansToDegrees($Radians, [$DoNotWrapValue]); + +Converts radians to degrees in the range from 0 to 360 or to corresponding degrees without +wrapping the converted value to 0 to 360. Default is to wrap the converted value. + +=item B<StringToBinary> + + $BinaryString = StringToBinary($String, [$UseReverseBitOrder]); + +Converts specified I<String> into a B<Binarystring>. Going from left to right, two ways of arranging +bits inside each byte are available: Most Significat Bits (MSB) first or Least Significat Bits (LSB) first. +Default is MSB corresponding to descending bits order (PerlSpeak) inside each each packed byte +(Most singificat bits first). + +=item B<StringToHexadecimal> + + $HexadecimalString = StringToHexadecimal($String, + [$UseReverseBitOrder]); + +Convert string into a hexadecimal string. Two ways of arranging nybbles (pair of 4 bits in each +byte) are available: high nybbles first or low nybbles first. Default is MSB corresponding to high +nybbles (PerlSpeak) first. Low and high nybbles correspond to pair of a low and high four bits in a byte. + +=back + +=head1 AUTHOR + +Manish Sud <msud@san.rr.com> + +=head1 SEE ALSO + +Constants.pm, MathUtil.pm + +=head1 COPYRIGHT + +Copyright (C) 2015 Manish Sud. All rights reserved. + +This file is part of MayaChemTools. + +MayaChemTools is free software; you can redistribute it and/or modify it under +the terms of the GNU Lesser General Public License as published by the Free +Software Foundation; either version 3 of the License, or (at your option) +any later version. + +=cut