如何在十六进制和十进制之间转换数字

在 C # 中如何在十六进制数和十进制数之间进行转换?

420643 次浏览
String stringrep = myintvar.ToString("X");


int num = int.Parse("FF", System.Globalization.NumberStyles.HexNumber);

看起来你可以说

Convert.ToInt64(value, 16)

从己十六进制中得到十进制。

反过来就是:

otherVar.ToString("X");

来自 Geekpedia :

// Store integer 182
int decValue = 182;


// Convert integer 182 as a hex in a string variable
string hexValue = decValue.ToString("X");


// Convert the hex string back to the number
int decAgain = int.Parse(hexValue, System.Globalization.NumberStyles.HexNumber);

十六进制-> 小数:

Convert.ToInt64(hexString, 16);

十进制-> 十六进制

string.Format("{0:x}", intValue);

将十进制转换为十六进制。

string hexValue = decValue.ToString("X");

将十六进制转换为十进制。

int decValue = int.Parse(hexValue, System.Globalization.NumberStyles.HexNumber);

或者

int decValue = Convert.ToInt32(hexValue, 16);
    static string chex(byte e)                  // Convert a byte to a string representing that byte in hexadecimal
{
string r = "";
string chars = "0123456789ABCDEF";
r += chars[e >> 4];
return r += chars[e &= 0x0F];
}           // Easy enough...


static byte CRAZY_BYTE(string t, int i)     // Take a byte, if zero return zero, else throw exception (i=0 means false, i>0 means true)
{
if (i == 0) return 0;
throw new Exception(t);
}


static byte hbyte(string e)                 // Take 2 characters: these are hex chars, convert it to a byte
{                                           // WARNING: This code will make small children cry. Rated R.
e = e.ToUpper(); //
string msg = "INVALID CHARS";           // The message that will be thrown if the hex str is invalid


byte[] t = new byte[]                   // Gets the 2 characters and puts them in seperate entries in a byte array.
{                                       // This will throw an exception if (e.Length != 2).
(byte)e[CRAZY_BYTE("INVALID LENGTH", e.Length ^ 0x02)],
(byte)e[0x01]
};


for (byte i = 0x00; i < 0x02; i++)      // Convert those [ascii] characters to [hexadecimal] characters. Error out if either character is invalid.
{
t[i] -= (byte)((t[i] >= 0x30) ? 0x30 : CRAZY_BYTE(msg, 0x01));                                  // Check for 0-9
t[i] -= (byte)((!(t[i] < 0x0A)) ? (t[i] >= 0x11 ? 0x07 : CRAZY_BYTE(msg, 0x01)) : 0x00);        // Check for A-F
}


return t[0x01] |= t[0x00] <<= 0x04;     // The moment of truth.
}

这不是真正简单的方法,但是这个源代码使您能够纠正任何类型的八进制数,即23.214、23和0.512等等。希望这个能帮到你。.

    public string octal_to_decimal(string m_value)
{
double i, j, x = 0;
Int64 main_value;
int k = 0;
bool pw = true, ch;
int position_pt = m_value.IndexOf(".");
if (position_pt == -1)
{
main_value = Convert.ToInt64(m_value);
ch = false;
}
else
{
main_value = Convert.ToInt64(m_value.Remove(position_pt, m_value.Length - position_pt));
ch = true;
}


while (k <= 1)
{
do
{
i = main_value % 10;                                        // Return Remainder
i = i * Convert.ToDouble(Math.Pow(8, x));                   // calculate power
if (pw)
x++;
else
x--;
o_to_d = o_to_d + i;                                        // Saving Required calculated value in main variable
main_value = main_value / 10;                               // Dividing the main value
}
while (main_value >= 1);
if (ch)
{
k++;
main_value = Convert.ToInt64(Reversestring(m_value.Remove(0, position_pt + 1)));
}
else
k = 2;
pw = false;
x = -1;
}
return (Convert.ToString(o_to_d));
}

如果它是一个超出正常整数容量的十六进制字符串:

对于.NET 3.5,我们可以使用 BouncyCastle 的 BigInteger 类:

String hex = "68c7b05d0000000002f8";
// results in "494809724602834812404472"
String decimal = new Org.BouncyCastle.Math.BigInteger(hex, 16).ToString();

NET 4.0具有 BigInteger类。

一种将字节数组转换为十六进制表示形式的扩展方法。该方法用前导零填充每个字节。

    /// <summary>
/// Turns the byte array into its Hex representation.
/// </summary>
public static string ToHex(this byte[] y)
{
StringBuilder sb = new StringBuilder();
foreach (byte b in y)
{
sb.Append(b.ToString("X").PadLeft(2, "0"[0]));
}
return sb.ToString();
}

如果希望在执行从十六进制到十进制数的转换时获得最佳性能,可以使用预填充十六进制到十进制值表的方法。

下面是说明这个想法的代码,我的 性能测试表明它比 Convert.ToInt32(...)快20% -40% :

class TableConvert
{
static sbyte[] unhex_table =
{ -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1
,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1
,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1
, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9,-1,-1,-1,-1,-1,-1
,-1,10,11,12,13,14,15,-1,-1,-1,-1,-1,-1,-1,-1,-1
,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1
,-1,10,11,12,13,14,15,-1,-1,-1,-1,-1,-1,-1,-1,-1
,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1
};


public static int Convert(string hexNumber)
{
int decValue = unhex_table[(byte)hexNumber[0]];
for (int i = 1; i < hexNumber.Length; i++)
{
decValue *= 16;
decValue += unhex_table[(byte)hexNumber[i]];
}
return decValue;
}
}

我的功能是:

using System;
using System.Collections.Generic;
class HexadecimalToDecimal
{
static Dictionary<char, int> hexdecval = new Dictionary<char, int>{
{'0', 0},
{'1', 1},
{'2', 2},
{'3', 3},
{'4', 4},
{'5', 5},
{'6', 6},
{'7', 7},
{'8', 8},
{'9', 9},
{'a', 10},
{'b', 11},
{'c', 12},
{'d', 13},
{'e', 14},
{'f', 15},
};


static decimal HexToDec(string hex)
{
decimal result = 0;
hex = hex.ToLower();


for (int i = 0; i < hex.Length; i++)
{
char valAt = hex[hex.Length - 1 - i];
result += hexdecval[valAt] * (int)Math.Pow(16, i);
}


return result;
}


static void Main()
{


Console.WriteLine("Enter Hexadecimal value");
string hex = Console.ReadLine().Trim();


//string hex = "29A";
Console.WriteLine("Hex {0} is dec {1}", hex, HexToDec(hex));


Console.ReadKey();
}
}

我的版本是我认为更容易理解,因为我的 C # 知识不是很高。 我正在使用这个算法: http://easyguyevo.hubpages.com/hub/Convert-Hex-to-Decimal(示例2)

using System;
using System.Collections.Generic;


static class Tool
{
public static string DecToHex(int x)
{
string result = "";


while (x != 0)
{
if ((x % 16) < 10)
result = x % 16 + result;
else
{
string temp = "";


switch (x % 16)
{
case 10: temp = "A"; break;
case 11: temp = "B"; break;
case 12: temp = "C"; break;
case 13: temp = "D"; break;
case 14: temp = "E"; break;
case 15: temp = "F"; break;
}


result = temp + result;
}


x /= 16;
}


return result;
}


public static int HexToDec(string x)
{
int result = 0;
int count = x.Length - 1;
for (int i = 0; i < x.Length; i++)
{
int temp = 0;
switch (x[i])
{
case 'A': temp = 10; break;
case 'B': temp = 11; break;
case 'C': temp = 12; break;
case 'D': temp = 13; break;
case 'E': temp = 14; break;
case 'F': temp = 15; break;
default: temp = -48 + (int)x[i]; break; // -48 because of ASCII
}


result += temp * (int)(Math.Pow(16, count));
count--;
}


return result;
}
}


class Program
{
static void Main(string[] args)
{
Console.Write("Enter Decimal value: ");
int decNum = int.Parse(Console.ReadLine());


Console.WriteLine("Dec {0} is hex {1}", decNum, Tool.DecToHex(decNum));


Console.Write("\nEnter Hexadecimal value: ");
string hexNum = Console.ReadLine().ToUpper();


Console.WriteLine("Hex {0} is dec {1}", hexNum, Tool.HexToDec(hexNum));


Console.ReadKey();
}
}

将二进制转换为十六进制

Convert.ToString(Convert.ToUInt32(binary1, 2), 16).ToUpper()

十六进制到十进制的转换

Convert.ToInt32(number, 16);

十进制到十六进制的转换

int.Parse(number, System.Globalization.NumberStyles.HexNumber)

有关详细信息,请查看本文

尝试在 C # 中使用 BigNumber-表示任意大的有符号整数。

程序

using System.Numerics;
...
var bigNumber = BigInteger.Parse("837593454735734579347547357233757342857087879423437472347757234945743");
Console.WriteLine(bigNumber.ToString("X"));

输出

4F30DC39A5B10A824134D5B18EEA3707AC854EE565414ED2E498DCFDE1A15DA5FEB6074AE248458435BD417F06F674EB29A2CFECF

可能的例外,

值为空。

FormatException-value 的格式不正确。

结论

您可以转换字符串并在 BigNumber 中存储值,而不限制数字的大小,除非字符串为空且非字母表

我的解决方案有点像回到基础,但它不使用任何内置函数在数字系统之间进行转换。

    public static string DecToHex(long a)
{
int n = 1;
long b = a;
while (b > 15)
{
b /= 16;
n++;
}
string[] t = new string[n];
int i = 0, j = n - 1;
do
{
if (a % 16 == 10) t[i] = "A";
else if (a % 16 == 11) t[i] = "B";
else if (a % 16 == 12) t[i] = "C";
else if (a % 16 == 13) t[i] = "D";
else if (a % 16 == 14) t[i] = "E";
else if (a % 16 == 15) t[i] = "F";
else t[i] = (a % 16).ToString();
a /= 16;
i++;
}
while ((a * 16) > 15);
string[] r = new string[n];
for (i = 0; i < n; i++)
{
r[i] = t[j];
j--;
}
string res = string.Concat(r);
return res;
}

您可以使用此代码并可能设置十六进制长度和部分的:

const int decimal_places = 4;
const int int_places = 4;
static readonly string decimal_places_format = $"X{decimal_places}";
static readonly string int_places_format = $"X{int_places}";


public static string DecimaltoHex(decimal number)
{
var n = (int)Math.Truncate(number);
var f = (int)Math.Truncate((number - n) * ((decimal)Math.Pow(10, decimal_places)));
return $"{string.Format($"\{\{0:{int_places_format}}}", n)}{string.Format($"\{\{0:{decimal_places_format}}}", f)}";
}


public static decimal HextoDecimal(string number)
{
var n = number.Substring(0, number.Length - decimal_places);
var f = number.Substring(number.Length - decimal_places);
return decimal.Parse($"{int.Parse(n, System.Globalization.NumberStyles.HexNumber)}.{int.Parse(f, System.Globalization.NumberStyles.HexNumber)}");
}

这个对我很管用:

public static decimal HexToDec(string hex)
{
if (hex.Length % 2 == 1)
hex = "0" + hex;
byte[] raw = new byte[hex.Length / 2];
decimal d = 0;
for (int i = 0; i < raw.Length; i++)
{
raw[i] = Convert.ToByte(hex.Substring(i * 2, 2), 16);
d += Math.Pow(256, (raw.Length - 1 - i)) * raw[i];
}
return d.ToString();
return d;
}

十进制-六进制

        var decValue = int.Parse(Console.ReadLine());
string hex = string.Format("{0:x}", decValue);
Console.WriteLine(hex);

Hexa-Decimal (使用名称空间: 使用 System.global;)

        var hexval = Console.ReadLine();
int decValue = int.Parse(hexval, NumberStyles.HexNumber);
Console.WriteLine(decValue);

四个 C # 本地方法转换十六进制到十二月和返回:

using System;


namespace Hexadecimal_and_Decimal
{
internal class Program
{
private static void Main(string[] args)
{
string hex = "4DEAD";
int dec;


// hex to dec:
dec = int.Parse(hex, System.Globalization.NumberStyles.HexNumber);
// or:
dec = Convert.ToInt32(hex, 16);


// dec to hex:
hex = dec.ToString("X"); // lowcase: x, uppercase: X
// or:
hex = string.Format("{0:X}", dec); // lowcase: x, uppercase: X


Console.WriteLine("Hexadecimal number: " + hex);
Console.WriteLine("Decimal number: " + dec);
}
}
}