Konversi integer ke heksadesimal dan kembali lagi

461

Bagaimana saya bisa mengonversi yang berikut?

2934 (integer) ke B76 (hex)

Biarkan saya menjelaskan apa yang saya coba lakukan. Saya memiliki ID Pengguna di database saya yang disimpan sebagai bilangan bulat. Daripada meminta pengguna referensi ID mereka, saya ingin mereka menggunakan nilai hex. Alasan utamanya adalah karena lebih pendek.

Jadi tidak hanya saya harus pergi dari integer ke hex tetapi saya juga harus pergi dari hex ke integer.

Apakah ada cara mudah untuk melakukan ini di C #?

codette
sumber
65
FYI, Anda akan menyinggung pengguna tombol Numeric.
Daniel A. White
1
Kamu punya pendapat bagus. Tetapi kami mencoba mengubah ID integer menjadi sesuatu yang membutuhkan lebih sedikit karakter. Terima kasih atas wawasannya.
codette
Respons yang terlambat, tetapi apakah Anda sudah mempertimbangkan semacam Integerpemendekan implementasi? Jika satu-satunya tujuan adalah membuat ID pengguna sesingkat mungkin, saya akan tertarik untuk mengetahui apakah ada alasan lain yang jelas mengapa Anda secara khusus memerlukan konversi heksadesimal - kecuali saya tentu saja melewatkannya. Apakah jelas dan diketahui (jika diperlukan) bahwa ID pengguna sebenarnya merupakan representasi heksadesimal dari nilai sebenarnya?
WynandB
1
@codette Menyimpan angka sebagai angka akan memakan waktu paling sedikit saat masih dapat dibaca. Misalnya, 4 byte untuk angka hingga 2bln (integer). Atau jika terlalu panjang untuk jenis numerik apa pun, gunakan bidang biner.
Luc
9
@ Luc OP menyatakan saya memiliki ID Pengguna di database saya yang disimpan sebagai bilangan bulat. Daripada meminta pengguna referensi ID mereka, saya ingin mereka menggunakan nilai hex. jadi codette menyimpan nilai-nilai sebagai int, tetapi mengkonversi ke / dari hex untuk pengguna.
Ditutup pada

Jawaban:

854
// Store integer 182
int intValue = 182;
// Convert integer 182 as a hex in a string variable
string hexValue = intValue.ToString("X");
// Convert the hex string back to the number
int intAgain = int.Parse(hexValue, System.Globalization.NumberStyles.HexNumber);

dari http://www.geekpedia.com/KB8_How-do-I-convert-from-decimal-to-hex-and-hex-to-decimal.html

Gavin Miller
sumber
179
Anda juga dapat menentukan jumlah digit dengan menggunakan: decValue.ToString ("X4")
Martin
78
Karena ini belum disebutkan di sini: Jika Anda menggunakan huruf kecil x (mis. ToString ("x4), Anda mendapatkan nilai hex huruf kecil (mis. B76).
Skalli
14
Apakah saya satu-satunya yang mengalami kesulitan mentolerir nama variabel "decValue" karena itu bukan desimal sama sekali? Maaf kawan, saya tahu itu dari sumber lain, tetapi stackoverflow seharusnya lebih baik dari itu.
Christopher Bonitz 3-15
8
@bonitzenator lol, dalam 6 tahun jawaban ini sudah ada, saya tidak pernah memperhatikan itu. Diperbarui!
Gavin Miller
1
Perhatikan bahwa solusi hex to int Anda akan menghasilkan bilangan bulat DITANDATANGANI dan maksimum pada 8 karakter hex.
Scott Solmer
60

Coba yang berikut ini untuk mengubahnya menjadi hex

public static string ToHex(this int value) {
  return String.Format("0x{0:X}", value);
}

Dan kembali lagi

public static int FromHex(string value) {
  // strip the leading 0x
  if ( value.StartsWith("0x", StringComparison.OrdinalIgnoreCase)) {
    value = value.Substring(2);
  }
  return Int32.Parse(value, NumberStyles.HexNumber);
}
JaredPar
sumber
Tidak terlalu yakin mengapa saya layak mendapatkan -1 tetapi saya kira saya menyinggung seseorang.
JaredPar
9
atau "0x" sedikit, yang merupakan sesuatu yang OP tidak benar-benar inginkan
31930 Philippe Leybaert
3
saya memperbaiki format ejaan - tetapi tidak downvote. downvotes tanpa penjelasan membuat saya marah-marah juga ...
Scott Ivey
@ Pilipe, mungkin tetapi sepertinya hal yang sangat konyol untuk downvote. Terutama mengingat setengah jawaban aslinya tidak memiliki hex -> int bagian
JaredPar
8
(Maaf sudah berkomentar). Pertanyaannya adalah "bagaimana cara mengkonversi 2934 ke B76". Jawaban lain memang hanya menyediakan setengah dari solusi, tetapi jawaban Anda dikonversi "2934" menjadi "0xB76". Itu sama sekali bukan solusi yang buruk, tetapi itu bukan jawaban untuk pertanyaan yang diajukan.
Philippe Leybaert
20
int valInt = 12;
Console.WriteLine(valInt.ToString("X"));  // C  ~ possibly single-digit output 
Console.WriteLine(valInt.ToString("X2")); // 0C ~ always double-digit output
pengguna2179382
sumber
19
string HexFromID(int ID)
{
    return ID.ToString("X");
}

int IDFromHex(string HexID)
{
    return int.Parse(HexID, System.Globalization.NumberStyles.HexNumber);
}

Saya benar-benar mempertanyakan nilai ini. Anda menyatakan sasaran adalah untuk membuat nilainya lebih pendek, yang akan terjadi, tetapi itu bukan tujuan itu sendiri. Maksud Anda, membuatnya lebih mudah diingat atau mudah diketik.

Jika Anda bermaksud lebih mudah diingat, maka Anda mengambil langkah mundur. Kita tahu ukurannya masih sama, hanya disandikan berbeda. Tetapi pengguna Anda tidak akan tahu bahwa huruf dibatasi untuk 'A-F', dan ID akan menempati ruang konseptual yang sama untuk mereka seolah-olah huruf 'AZ' diizinkan. Jadi alih-alih seperti menghafal nomor telepon, itu lebih seperti menghafal GUID (dengan panjang yang setara).

Jika Anda maksud mengetik, alih-alih dapat menggunakan papan tombol, pengguna kini harus menggunakan bagian utama papan ketik. Mungkin akan lebih sulit untuk mengetik, karena itu bukan kata yang dikenali jari mereka.

Opsi yang jauh lebih baik adalah membiarkan mereka memilih nama pengguna yang sebenarnya.

Joel Coehoorn
sumber
Tujuannya adalah untuk mengambil lebih sedikit karakter. Ambil twitter sebagai contoh di mana mereka hanya mengizinkan 140 pesan karakter. Kami melakukan sesuatu yang serupa sehingga kami berusaha memberi pengguna kami cara mempersingkat ID pengguna mereka.
codette
3
Dalam hal ini, Anda harus memikirkan representasi biner. Ini kemungkinan int 32bit yang tidak menggunakan bagian negatif, yang berarti resolusi 16 bit. Anda dapat menempatkannya dalam satu karakter unicode dengan cukup mudah.
Joel Coehoorn
5
Respons yang terlambat, tetapi - int 32 bit (ditandatangani) yang tidak pernah mengandung angka negatif memiliki 31 bit resolusi, bukan 16. Anda mungkin dapat memasukkannya ke dalam satu karakter unicode, tetapi ketika itu disandikan UTF8, kecuali antara 0 dan 127 itu akan mengambil lebih banyak karakter daripada setara hex. HEX bukan solusi yang mengerikan untuk masalah ini, tetapi base64 dari empat byte di int akan lebih pendek (dan Anda bisa memotong bantalannya)
James Hart
Ya, saya punya kentut otak di sana. Saya berharap saya bisa mengedit komentar.
Joel Coehoorn
15

Ke Hex:

string hex = intValue.ToString("X");

Ke int:

int intValue = int.Parse(hex, System.Globalization.NumberStyles.HexNumber)
Brandon
sumber
7

Saya membuat solusi saya sendiri untuk mengkonversi int ke string Hex dan kembali sebelum saya menemukan jawaban ini. Tidak mengherankan, ini jauh lebih cepat daripada solusi .net karena ada sedikit overhead kode.

        /// <summary>
        /// Convert an integer to a string of hexidecimal numbers.
        /// </summary>
        /// <param name="n">The int to convert to Hex representation</param>
        /// <param name="len">number of digits in the hex string. Pads with leading zeros.</param>
        /// <returns></returns>
        private static String IntToHexString(int n, int len)
        {
            char[] ch = new char[len--];
            for (int i = len; i >= 0; i--)
            {
                ch[len - i] = ByteToHexChar((byte)((uint)(n >> 4 * i) & 15));
            }
            return new String(ch);
        }

        /// <summary>
        /// Convert a byte to a hexidecimal char
        /// </summary>
        /// <param name="b"></param>
        /// <returns></returns>
        private static char ByteToHexChar(byte b)
        {
            if (b < 0 || b > 15)
                throw new Exception("IntToHexChar: input out of range for Hex value");
            return b < 10 ? (char)(b + 48) : (char)(b + 55);
        }

        /// <summary>
        /// Convert a hexidecimal string to an base 10 integer
        /// </summary>
        /// <param name="str"></param>
        /// <returns></returns>
        private static int HexStringToInt(String str)
        {
            int value = 0;
            for (int i = 0; i < str.Length; i++)
            {
                value += HexCharToInt(str[i]) << ((str.Length - 1 - i) * 4);
            }
            return value;
        }

        /// <summary>
        /// Convert a hex char to it an integer.
        /// </summary>
        /// <param name="ch"></param>
        /// <returns></returns>
        private static int HexCharToInt(char ch)
        {
            if (ch < 48 || (ch > 57 && ch < 65) || ch > 70)
                throw new Exception("HexCharToInt: input out of range for Hex value");
            return (ch < 58) ? ch - 48 : ch - 55;
        }

Kode waktu:

static void Main(string[] args)
        {
            int num = 3500;
            long start = System.Diagnostics.Stopwatch.GetTimestamp();
            for (int i = 0; i < 2000000; i++)
                if (num != HexStringToInt(IntToHexString(num, 3)))
                    Console.WriteLine(num + " = " + HexStringToInt(IntToHexString(num, 3)));
            long end = System.Diagnostics.Stopwatch.GetTimestamp();
            Console.WriteLine(((double)end - (double)start)/(double)System.Diagnostics.Stopwatch.Frequency);

            for (int i = 0; i < 2000000; i++)
                if (num != Convert.ToInt32(num.ToString("X3"), 16))
                    Console.WriteLine(i);
            end = System.Diagnostics.Stopwatch.GetTimestamp();
            Console.WriteLine(((double)end - (double)start)/(double)System.Diagnostics.Stopwatch.Frequency);
            Console.ReadLine(); 
        }

Hasil:

Digits : MyCode : .Net
1 : 0.21 : 0.45
2 : 0.31 : 0.56
4 : 0.51 : 0.78
6 : 0.70 : 1.02
8 : 0.90 : 1.25
Eric Helms
sumber
1

KERANGKA BERSIH

Sangat dijelaskan dan beberapa baris pemrograman PEKERJAAN BAIK

// Store integer 182
int intValue = 182;
// Convert integer 182 as a hex in a string variable
string hexValue = intValue.ToString("X");
// Convert the hex string back to the number
int intAgain = int.Parse(hexValue, System.Globalization.NumberStyles.HexNumber);

PASCAL >> C #

http://files.hddguru.com/download/Software/Seagate/St_mem.pas

Sesuatu dari prosedur pascal yang sangat lama diubah menjadi C #

    /// <summary>
    /// Conver number from Decadic to Hexadecimal
    /// </summary>
    /// <param name="w"></param>
    /// <returns></returns>
    public string MakeHex(int w)
    {
        try
        {
           char[] b =  {'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'};
           char[] S = new char[7];

              S[0] = b[(w >> 24) & 15];
              S[1] = b[(w >> 20) & 15];
              S[2] = b[(w >> 16) & 15];
              S[3] = b[(w >> 12) & 15];
              S[4] = b[(w >> 8) & 15];
              S[5] = b[(w >> 4) & 15];
              S[6] = b[w & 15];

              string _MakeHex = new string(S, 0, S.Count());

              return _MakeHex;
        }
        catch (Exception ex)
        {

            throw;
        }
    }
Jaar
sumber
2
Terima kasih atas balasannya Jika mungkin, silakan terjemahkan ke Bahasa Inggris sebaik mungkin. Jangan khawatir tentang kemungkinan kesalahan tata bahasa, kami akan memperbaikinya.
bcperth
-5

int ke hex:

int a = 72;

Console.WriteLine ("{0: X}", a);

heks ke int:

int b = 0xB76;

Console.WriteLine (b);

pemula
sumber