C#: Conversión de números: binario/octal/decimal/hexadecimal

Tiempo de lectura: 5 minutos

//Usings.
using System;
using System.Text;

/// <summary>
/// Convierte un número binario en octal.
/// </summary>
/// <param name="binaryNumber">El número binario a convertir representado como una cadena de caracteres.</param>
/// <returns>El número octal resultante como una cadena de caracteres.</returns>
public static string ConvertBinaryToOctal(string binaryNumber)
{
	if (!IsBinary(binaryNumber))
	{
		throw new ArgumentException("El número binario no es válido.");
	}

	int numDigits = binaryNumber.Length;
	int paddingZeros = (numDigits % 3 == 0) ? 0 : (3 - (numDigits % 3));
	binaryNumber = new string('0', paddingZeros) + binaryNumber;

	StringBuilder octalNumber = new StringBuilder();

	for (int i = 0; i < binaryNumber.Length; i += 3)
	{
		string binaryGroup = binaryNumber.Substring(i, 3);
		int decimalValue = ConvertBinaryToDecimal(binaryGroup);
		octalNumber.Append(ConvertDecimalToOctal(decimalValue));
	}

	return octalNumber.ToString().TrimStart('0');
}

/// <summary>
/// Convierte un número binario en decimal.
/// </summary>
/// <param name="binaryNumber">El número binario a convertir representado como una cadena de caracteres.</param>
/// <returns>El número decimal resultante.</returns>
public static int ConvertBinaryToDecimal(string binaryNumber)
{
	if (!IsBinary(binaryNumber))
	{
		throw new ArgumentException("El número binario no es válido.");
	}

	int decimalNumber = 0;
	int power = 0;

	for (int i = binaryNumber.Length - 1; i >= 0; i--)
	{
		if (binaryNumber[i] == '1')
		{
			decimalNumber += (int)Math.Pow(2, power);
		}
		power++;
	}

	return decimalNumber;
}

/// <summary>
/// Convierte un número binario en hexadecimal.
/// </summary>
/// <param name="binaryNumber">El número binario a convertir representado como una cadena de caracteres.</param>
/// <returns>El número hexadecimal resultante como una cadena de caracteres.</returns>
public static string ConvertBinaryToHexadecimal(string binaryNumber)
{
	if (!IsBinary(binaryNumber))
	{
		throw new ArgumentException("El número binario no es válido.");
	}

	int numDigits = binaryNumber.Length;
	int paddingZeros = (numDigits % 4 == 0) ? 0 : (4 - (numDigits % 4));
	binaryNumber = new string('0', paddingZeros) + binaryNumber;

	StringBuilder hexadecimalNumber = new StringBuilder();

	for (int i = 0; i < binaryNumber.Length; i += 4)
	{
		string binaryGroup = binaryNumber.Substring(i, 4);
		int decimalValue = ConvertBinaryToDecimal(binaryGroup);
		hexadecimalNumber.Append(ConvertDecimalToHexadecimal(decimalValue));
	}

	return hexadecimalNumber.ToString().TrimStart('0');
}

/// <summary>
/// Convierte un número octal en binario.
/// </summary>
/// <param name="octalNumber">El número octal a convertir representado como una cadena de caracteres.</param>
/// <returns>El número binario resultante como una cadena de caracteres.</returns>
public static string ConvertOctalToBinary(string octalNumber)
{
	if (!IsOctal(octalNumber))
	{
		throw new ArgumentException("El número octal no es válido.");
	}

	StringBuilder binaryNumber = new StringBuilder();

	for (int i = 0; i < octalNumber.Length; i++)
	{
		int digitValue = ConvertOctalToDecimal(octalNumber[i].ToString());
		string binaryGroup = ConvertDecimalToBinary(digitValue);
		binaryNumber.Append(binaryGroup.PadLeft(3, '0'));
	}

	return binaryNumber.ToString().TrimStart('0');
}

/// <summary>
/// Convierte un número octal en decimal.
/// </summary>
/// <param name="octalNumber">El número octal a convertir representado como una cadena de caracteres.</param>
/// <returns>El número decimal resultante.</returns>
public static int ConvertOctalToDecimal(string octalNumber)
{
	if (!IsOctal(octalNumber))
	{
		throw new ArgumentException("El número octal no es válido.");
	}

	int decimalNumber = 0;
	int power = 0;

	for (int i = octalNumber.Length - 1; i >= 0; i--)
	{
		int digit = int.Parse(octalNumber[i].ToString());
		decimalNumber += digit * (int)Math.Pow(8, power);
		power++;
	}

	return decimalNumber;
}     

/// <summary>
/// Convierte un número octal en hexadecimal.
/// </summary>
/// <param name="octalNumber">El número octal a convertir representado como una cadena de caracteres.</param>
/// <returns>El número hexadecimal resultante como una cadena de caracteres.</returns>
public static string ConvertOctalToHexadecimal(string octalNumber)
{
	if (!IsOctal(octalNumber))
	{
		throw new ArgumentException("El número octal no es válido.");
	}

	string binaryNumber = ConvertOctalToBinary(octalNumber);
	string hexadecimalNumber = ConvertBinaryToHexadecimal(binaryNumber);

	return hexadecimalNumber.TrimStart('0');
}

/// <summary>
/// Convierte un número decimal en binario.
/// </summary>
/// <param name="decimalNumber">El número decimal a convertir.</param>
/// <returns>El número binario resultante como una cadena de caracteres.</returns>
public static string ConvertDecimalToBinary(int decimalNumber)
{
	if (decimalNumber < 0)
	{
		throw new ArgumentException("El número decimal debe ser no negativo.");
	}

	string binaryNumber = string.Empty;

	if (decimalNumber == 0)
	{
		binaryNumber = "0";
	}
	else
	{
		while (decimalNumber > 0)
		{
			int remainder = decimalNumber % 2;
			binaryNumber = remainder.ToString() + binaryNumber;
			decimalNumber /= 2;
		}
	}

	return binaryNumber.TrimStart('0');
}

/// <summary>
/// Convierte un número decimal en octal.
/// </summary>
/// <param name="decimalNumber">El número decimal a convertir.</param>
/// <returns>El número octal resultante como una cadena de caracteres.</returns>
public static string ConvertDecimalToOctal(int decimalNumber)
{
	if (decimalNumber < 0)
	{
		throw new ArgumentException("El número decimal debe ser no negativo.");
	}

	string octalNumber = string.Empty;

	if (decimalNumber == 0)
	{
		octalNumber = "0";
	}
	else
	{
		while (decimalNumber > 0)
		{
			int remainder = decimalNumber % 8;
			octalNumber = remainder.ToString() + octalNumber;
			decimalNumber /= 8;
		}
	}

	return octalNumber.TrimStart('0');
}

/// <summary>
/// Convierte un número decimal en hexadecimal.
/// </summary>
/// <param name="decimalNumber">El número decimal a convertir.</param>
/// <returns>El número hexadecimal resultante como una cadena de caracteres.</returns>
public static string ConvertDecimalToHexadecimal(int decimalNumber)
{
	if (decimalNumber < 0)
	{
		throw new ArgumentException("El número decimal debe ser no negativo.");
	}

	string hexadecimalNumber = string.Empty;

	if (decimalNumber == 0)
	{
		hexadecimalNumber = "0";
	}
	else
	{
		while (decimalNumber > 0)
		{
			int remainder = decimalNumber % 16;
			hexadecimalNumber = GetHexDigit(remainder) + hexadecimalNumber;
			decimalNumber /= 16;
		}
	}

	return hexadecimalNumber.TrimStart('0');
}

/// <summary>
/// Convierte un número hexadecimal en binario.
/// </summary>
/// <param name="hexadecimalNumber">El número hexadecimal a convertir representado como una cadena de caracteres.</param>
/// <returns>El número binario resultante como una cadena de caracteres.</returns>
public static string CovnertHexadecimalToBinary(string hexadecimalNumber)
{
	if (!IsHexadecimal(hexadecimalNumber))
	{
		throw new ArgumentException("El número hexadecimal no es válido.");
	}

	StringBuilder binaryNumber = new StringBuilder();

	for (int i = 0; i < hexadecimalNumber.Length; i++)
	{
		int digitValue = ConvertHexadecimalToDecimal(hexadecimalNumber[i].ToString());
		string binaryGroup = ConvertDecimalToBinary(digitValue);
		binaryNumber.Append(binaryGroup.PadLeft(4, '0'));
	}

	return binaryNumber.ToString().TrimStart('0');
}

/// <summary>
/// Convierte un número hexadecimal en octal.
/// </summary>
/// <param name="hexadecimalNumber">El número hexadecimal a convertir representado como una cadena de caracteres.</param>
/// <returns>El número octal resultante como una cadena de caracteres.</returns>
public static string ConvertHexadecimalToOctal(string hexadecimalNumber)
{
	if (!IsHexadecimal(hexadecimalNumber))
	{
		throw new ArgumentException("El número hexadecimal no es válido.");
	}

	string binaryNumber = CovnertHexadecimalToBinary(hexadecimalNumber);
	string octalNumber = ConvertBinaryToOctal(binaryNumber);

	return octalNumber.TrimStart('0');
}

/// <summary>
/// Convierte un número hexadecimal en decimal.
/// </summary>
/// <param name="hexadecimalNumber">El número hexadecimal a convertir representado como una cadena de caracteres.</param>
/// <returns>El número decimal resultante.</returns>
public static int ConvertHexadecimalToDecimal(string hexadecimalNumber)
{
	if (!IsHexadecimal(hexadecimalNumber))
	{
		throw new ArgumentException("El número hexadecimal no es válido.");
	}

	int decimalNumber = 0;
	int power = 0;

	for (int i = hexadecimalNumber.Length - 1; i >= 0; i--)
	{
		int digitValue = GetHexDigitValue(hexadecimalNumber[i]);
		decimalNumber += digitValue * (int)Math.Pow(16, power);
		power++;
	}

	return decimalNumber;
}

/// <summary>
/// Verifica si un número binario es válido.
/// </summary>
/// <param name="binaryNumber">El número binario a verificar.</param>
/// <returns>True si el número binario es válido, False en caso contrario.</returns>
public static bool IsBinary(string binaryNumber)
{
	bool isBinary = true;

	foreach (char digit in binaryNumber)
	{
		if (digit != '0' && digit != '1')
		{
			isBinary = false;
		}
	}

	return isBinary;
}

/// <summary>
/// Verifica si un número octal es válido.
/// </summary>
/// <param name="octalNumber">El número octal a verificar.</param>
/// <returns>True si el número octal es válido, False en caso contrario.</returns>
public static bool IsOctal(string octalNumber)
{
	bool isOctal = true;

	foreach (char digit in octalNumber)
	{
		if (digit < '0' || digit > '7')
		{
			isOctal = false;
		}
	}

	return isOctal;
}

/// <summary>
/// Verifica si un número hexadecimal es válido.
/// </summary>
/// <param name="hexadecimalNumber">El número hexadecimal a verificar.</param>
/// <returns>True si el número hexadecimal es válido, False en caso contrario.</returns>
public static bool IsHexadecimal(string hexadecimalNumber)
{
	bool isHexadecimal = true;

	foreach (char digit in hexadecimalNumber)
	{
		if (!IsHexDigit(digit))
		{
			isHexadecimal = false;
		}
	}

	return isHexadecimal;
}

/// <summary>
/// Verifica si un carácter es un dígito hexadecimal válido.
/// </summary>
/// <param name="hexDigit">El carácter a verificar.</param>
/// <returns>True si el carácter es un dígito hexadecimal válido, False en caso contrario.</returns>
public static bool IsHexDigit(char hexDigit)
{
	bool isHexDigit = (hexDigit >= '0' && hexDigit <= '9') ||
					  (hexDigit >= 'A' && hexDigit <= 'F') ||
					  (hexDigit >= 'a' && hexDigit <= 'f');

	return isHexDigit;
}

Deja un comentario