Cách chuyển đổi số giữa thập lục phân và thập phân


Câu trả lời:


281

Để chuyển đổi từ thập phân sang hex, ...

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

Để chuyển đổi từ hex sang thập phân, hãy ...

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

hoặc là

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

1
Tôi muốn hiểu cách dòng này decValue.ToString ("X") chuyển đổi nó thành Hex.
gizgok

20
Biến decValue có kiểu Int32. Int32 có tình trạng quá tải ToString () có thể chấp nhận một trong một số Chuỗi định dạng quy định cách giá trị sẽ được biểu diễn dưới dạng chuỗi. Chuỗi định dạng "X" có nghĩa là Hexidecimal nên 255.ToString ("X") sẽ trả về chuỗi thập lục phân "FF". Để biết thêm thông tin, hãy xem msdn.microsoft.com/en-us/l
Library / dowawaw9k.aspx

2
Câu trả lời tốt. Tôi thực sự đang sử dụng int.TryPude thay vì int.Pude cho việc này để tránh phải sử dụng khối bắt thử gây phiền nhiễu.
ROFLwTIME

9
@VadymStetsiak Convert.ToInt32 chỉ cần gọi Int32.Pude (int.Pude) (mặt cọ)
Cole Johnson

@ColeJohnson int.Parsekhông có tùy chọn để bạn chỉ định cơ sở là một int, giống như một trong số ít hợp lệ NumberStyles. Đối với cơ sở 16, hoặc là tốt, nhưng là một giải pháp chung, thật tốt khi biết cả hai hoạt động như thế nào.
Tim S.

54

Hex -> thập phân:

Convert.ToInt64(hexValue, 16);

Số thập phân -> Hex

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

6
+1 điều tuyệt vời Convert.ToInt64(hexValue, 16);là nó sẽ thực hiện chuyển đổi nếu có 0xtiền tố ở đó hay không, trong khi đó, một số giải pháp khác thì không.
Craig

@Craig hi, vì vậy tôi cần thực hiện chuyển đổi dựa trên kích thước giá trị hex hoặc tôi có thể áp dụng ToInt64 cho tất cả giá trị hex, liệu có ảnh hưởng gì không?
dùng1219310

26

Có vẻ như bạn có thể nói

Convert.ToInt64(value, 16)

để lấy số thập phân từ thập lục phân.

Một cách khác là:

otherVar.ToString("X");

Tôi nhận được System.FormatException: Định dạng được chỉ định 'x' không hợp lệ
c_Reg_c_Lark

13

Nếu bạn muốn hiệu suất tối đa khi thực hiện chuyển đổi từ số thập phân sang số thập phân, bạn có thể sử dụng phương pháp tiếp cận với bảng giá trị thập lục phân được điền trước.

Đây là mã minh họa ý tưởng đó. Các thử nghiệm hiệu suất của tôi cho thấy rằng nó có thể nhanh hơn 20% -40% so với Convert.ToInt32 (...):

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

Thiên tài! Tự hỏi nếu có thể làm cho trình biên dịch byte tự động sử dụng phương pháp này bên trong Convert.ToInt32?
Jeff Halverson

1
Tôi không thấy bất kỳ lý do tại sao nó không thể được thực hiện. Tuy nhiên, việc duy trì mảng sẽ tiêu tốn thêm bộ nhớ.
Vadym Stetsiak

8

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

Tôi đã sử dụng phương pháp này để tạo ra ứng dụng dotnet 4.0 nhỏ trong vài phút, hoạt động tuyệt vời chỉ với một vài dòng mã.
Thay vào đó là

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

Đây không phải là cách dễ nhất nhưng mã nguồn này cho phép bạn điều chỉnh mọi loại số bát phân, tức là 23.214, 23 và 0.512, v.v. Hy vọng điều này sẽ giúp bạn..

    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
chào mừng bạn đến với stackoverflow. bạn có thể vui lòng giải thích một chút mã của bạn (chỉ là một câu ngắn). Cảm ơn!
Daniele B

1

Hãy thử sử dụng BigNumber trong C # - Thể hiện số nguyên có chữ ký lớn tùy ý.

Chương trình

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

Đầu ra

4F30DC39A5B10A824134D5B18EEA3707AC854EE565414ED2E498DCFDE1A15DA5FEB6074AE248458435BD417F06F674EB29A2CFECF

Trường hợp ngoại lệ có thể,

ArgumentNullException - giá trị là null.

FormatException - giá trị không đúng định dạng.

Phần kết luận

Bạn có thể chuyển đổi chuỗi và lưu trữ một giá trị trong BigNumber mà không bị ràng buộc về kích thước của số trừ khi chuỗi trống và không phải là analphabets


0

Nếu đó là một chuỗi hex thực sự lớn vượt quá khả năng của số nguyên thông thường:

Đối với .NET 3.5, chúng ta có thể sử dụng lớp BigInteger của BouncyCastle:

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

.NET 4.0 có lớp BigInteger .


0

Phiên bản của tôi là tôi nghĩ dễ hiểu hơn một chút vì kiến ​​thức C # của tôi không quá cao. Tôi đang sử dụng thuật toán này: http://easyguyevo.hubpages.com/hub/Convert-Hex-to-Decimal (Ví dụ 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

Chuyển đổi nhị phân sang Hex

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

-1

Một phương thức mở rộng để chuyển đổi một mảng byte thành biểu diễn hex. Điều này đệm từng byte với số không hàng đầu.

    /// <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

Đây là chức năng của tôi:

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

Đây có thể là một ứng cử viên tốt cho Convertphương pháp mở rộng để người ta có thể viết: int hexa = Convert.ToHexadecimal(11);=)
Will Marcouiller

-1

Giải pháp của tôi hơi giống với việc quay lại căn bản, nhưng nó hoạt động mà không sử dụng bất kỳ chức năng tích hợp nào để chuyển đổi giữa các hệ thống số.

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

    }

}
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.