16 진수와 10 진수 사이의 숫자를 변환하는 방법


답변:


281

십진수를 16 진수로 변환하려면 ...

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

16 진수를 10 진수로 변환하려면 다음 중 하나를 수행하십시오.

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

또는

int decValue = Convert.ToInt32(hexValue, 16);

1
이 줄 decValue.ToString ( "X")이 어떻게 16 진수로 변환하는지 이해하고 싶습니다.
gizgok

20
decValue 변수는 Int32 유형입니다. Int32에는 값이 문자열로 표시되는 방법을 지시하는 여러 형식 문자열 중 하나를 허용하는 ToString () 오버로드가 있습니다. "X"형식 문자열은 16 진수를 의미하므로 255.ToString ( "X")은 16 진수 문자열 "FF"를 반환합니다. 자세한 내용은 msdn.microsoft.com/en-us/library/dwhawy9k.aspx를
Andy McCluggage

2
좋은 대답입니다. 실제로 성가신 try catch 블록을 사용하지 않기 위해 int.Parse 대신 int.TryParse를 사용하고 있습니다.
ROFLwTIME

9
@VadymStetsiak Convert.ToInt32 단지에서 Int32.Parse (int.Parse) (얼굴 팜) 호출
콜 존슨

@ColeJohnson int.Parse에는 int몇 가지 유효한 중 하나 인 것처럼 기본을으로 지정할 수있는 옵션이 없습니다 NumberStyles. 16 진법은 어느 쪽이든 괜찮지 만 일반적인 해결책으로는 두 가지가 어떻게 작동하는지 아는 것이 좋습니다.
Tim S.

54

16 진수-> 10 진수 :

Convert.ToInt64(hexValue, 16);

십진수-> 16 진수

string.format("{0:x}", decValue);

6
+1 좋은 점은 접두어가 Convert.ToInt64(hexValue, 16);있는지 여부에 따라 변환을 수행 0x하지만 다른 솔루션 중 일부는 변환하지 않습니다.
Craig

@Craig 안녕, 그래서 16 진수 값 크기를 기반으로 변환해야하거나 모든 16 진수 값에 ToInt64를 적용 할 수 있습니까?
user1219310

26

말할 수있는 것 같아

Convert.ToInt64(value, 16)

16 진수에서 소수점을 구합니다.

다른 방법은 다음과 같습니다.

otherVar.ToString("X");

System.FormatException이 발생합니다. 지정된 형식 'x'가 잘못되었습니다
c_Reg_c_Lark

13

16 진수에서 10 진수로 변환 할 때 최대 성능을 원하면 16 진수 값으로 미리 채워진 테이블에 접근 방식을 사용할 수 있습니다.

그 아이디어를 보여주는 코드는 다음과 같습니다. 내 성능 테스트에 따르면 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;
      }
  }

천재! 바이트 컴파일러가 Convert.ToInt32 내부에서이 접근 방식을 자동으로 사용할 수 있는지 궁금합니다.
Jeff Halverson

1
나는 그것을 할 수없는 이유를 보지 못합니다. 그러나 배열을 유지 관리하면 추가 메모리가 소비됩니다.
Vadym Stetsiak

8

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);

몇 분 만에 작은 dotnet 4.0 앱을 만들기 위해이 방법을 사용했으며 몇 줄의 코드로 잘 작동합니다.
RatherLogical

2
String stringrep = myintvar.ToString("X");

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


1
    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.
    }

1

이것은 가장 쉬운 방법은 아니지만이 소스 코드를 사용하면 모든 유형의 8 진수 (예 : 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));
    }    

2
stackoverflow에 오신 것을 환영합니다. 약간의 코드를 설명해 주시겠습니까? 감사!
Daniele B

1

C #에서 BigNumber를 사용해보십시오. 임의로 큰 부호있는 정수를 나타냅니다.

프로그램

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

산출

4F30DC39A5B10A824134D5B18EEA3707AC854EE565414ED2E498DCFDE1A15DA5FEB6074AE248458435BD417F06F674EB29A2CFECF

가능한 예외

ArgumentNullException-값이 null

FormatException-값이 올바른 형식이 아닙니다.

결론

문자열이 비어 있고 알파벳이 아닌 경우를 제외하고 문자열을 변환하고 숫자 크기에 대한 제약없이 BigNumber에 값을 저장할 수 있습니다.


0

정규 정수보다 큰 16 진 문자열 인 경우 :

.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 클래스가 있습니다.


0

내 버전은 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();
    }
}

0

이진수를 16 진수로 변환

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

-1

바이트 배열을 16 진 표현으로 변환하기위한 확장 메소드입니다. 이것은 각 바이트를 선행 0으로 채 웁니다.

    /// <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();
    }

-1

내 기능은 다음과 같습니다.

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();
    }
}

이것은 Convert확장 방법에 대한 좋은 후보가 될 수 있으므로 다음과 같이 쓸 수 있습니다 . int hexa = Convert.ToHexadecimal(11);=)
Will Marcouiller

-1

내 솔루션은 기본으로 돌아가는 것과 비슷하지만 내장 시스템을 사용하여 숫자 시스템간에 변환하지 않고 작동합니다.

    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;
    }

-1
class HexToDecimal
{
    static void Main()
    {
        while (true)
        {
            Console.Write("Enter digit number to convert: ");
            int n = int.Parse(Console.ReadLine()); // set hexadecimal digit number  
            Console.Write("Enter hexadecimal number: ");
            string str = Console.ReadLine();
            str.Reverse();

            char[] ch = str.ToCharArray();
            int[] intarray = new int[n];

            decimal decimalval = 0;

            for (int i = ch.Length - 1; i >= 0; i--)
            {
                if (ch[i] == '0')
                    intarray[i] = 0;
                if (ch[i] == '1')
                    intarray[i] = 1;
                if (ch[i] == '2')
                    intarray[i] = 2;
                if (ch[i] == '3')
                    intarray[i] = 3;
                if (ch[i] == '4')
                    intarray[i] = 4;
                if (ch[i] == '5')
                    intarray[i] = 5;
                if (ch[i] == '6')
                    intarray[i] = 6;
                if (ch[i] == '7')
                    intarray[i] = 7;
                if (ch[i] == '8')
                    intarray[i] = 8;
                if (ch[i] == '9')
                    intarray[i] = 9;
                if (ch[i] == 'A')
                    intarray[i] = 10;
                if (ch[i] == 'B')
                    intarray[i] = 11;
                if (ch[i] == 'C')
                    intarray[i] = 12;
                if (ch[i] == 'D')
                    intarray[i] = 13;
                if (ch[i] == 'E')
                    intarray[i] = 14;
                if (ch[i] == 'F')
                    intarray[i] = 15;

                decimalval += intarray[i] * (decimal)Math.Pow(16, ch.Length - 1 - i);

            }

            Console.WriteLine(decimalval);
        }

    }

}
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.