Tamsayıyı onaltılıya ve tekrar geri dönüştür


461

Aşağıdakileri nasıl dönüştürebilirim?

2934 (tamsayı) - B76 (onaltılık)

Ne yapmaya çalıştığımı açıklayayım. Veritabanımda tamsayı olarak saklanan kullanıcı kimlikleri var. Kullanıcıların kimliklerini referanslamak yerine onaltılık değeri kullanmasına izin vermek istiyorum. Bunun ana nedeni daha kısa olmasıdır.

Bu yüzden sadece tamsayıdan hex'e gitmem gerekiyor, aynı zamanda hex'den tamsayıya gitmem gerekiyor.

C # bunu yapmanın kolay bir yolu var mı?


65
Bilginize, Sayısal tuş takımı kullanıcılarını rahatsız edeceksiniz.
Daniel A. White

1
İyi bir noktaya temas ettiniz. Ama tamsayı kimliğini daha az karakter alan bir şeye dönüştürmeye çalışıyoruz. İçgörü için teşekkürler tho.
codette

Modaya uygun gecikmiş bir yanıt, ancak bir tür Integerkısaltma uygulamasını düşündünüz mü? Tek hedef, kullanıcı kimliğini olabildiğince kısa yapmaksa, özellikle onaltılık dönüşüm gerektirdiğinin açık bir nedeni olup olmadığını bilmek isterim - elbette kaçırmadıkça. Kullanıcı kimliklerinin gerçekte gerçek değerin onaltılık bir temsili olduğu açık ve biliniyor mu?
WynandB

1
@codette Sayıların sayı olarak depolanması, okunabilir durumda iken en az yer kaplar. Örneğin, 2 milyar'a kadar sayılar için 4 bayt (tamsayı). Veya herhangi bir sayısal tür için çok uzunsa, bir ikili alan kullanın.
Luc

9
@Luc Veritabanımda tamsayı olarak saklanan Kullanıcı Kimlikleri olduğunu belirtir. Kullanıcıların kimliklerini referanslamak yerine onaltılı değer kullanmalarına izin vermek istiyorum. böylece codette değerleri int olarak saklar, ancak kullanıcı için hex'e / ondan dönüştürür.
Trisped

Yanıtlar:


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

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


179
basamak sayısını kullanarak da belirtebilirsiniz: decValue.ToString ("X4")
Martin

78
Burada bahsedilmediğinden: Düşük taban x (örn. ToString ("x4)) kullanırsanız, küçük harfli onaltılık bir değer elde edersiniz (örn. B76).
Skalli

14
Hiç ondalık olmadığı için "decValue" değişken adını tolere etmekte zorlanan tek kişi miyim? Üzgünüm dostum, bunun başka bir kaynaktan olduğunu biliyorum, ama stackoverflow bundan daha iyi olmalı.
Christopher Bonitz

8
@bonitzenator lol, 6 yıl içinde bu cevap var, bunu hiç fark etmedim. Güncellenmiş!
Gavin Miller

1
Hex-int çözümünüzün SIGNED tamsayıları üreteceğini ve 8 hex karakterde maks.
Scott Solmer


60

Onaltılık biçime dönüştürmek için aşağıdakileri deneyin

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

Ve tekrar geri

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

Neden -1'i hak ettiğimden çok emin değilim ama sanırım birini rahatsız ettim.
JaredPar

9
veya OP'nin gerçekten istemediği bir şey olan "0x" biti
Philippe Leybaert

3
Biçim yazım düzeltildi - ama aşağı itmedi. hiçbir açıklama ile downvotes beni de huysuz yapmak ...
Scott Ivey

@Philippe, belki ama aşağı indirmek için çok aptalca bir şey gibi görünüyor. Özellikle cevapların yarısı dikkate alındığında başlangıçta hex -> int bölümü yoktu
JaredPar

8
(Yorum yaptığım için üzgünüm). Soru "2934'ü B76'ya nasıl dönüştürebilirim" idi. Diğer cevaplar gerçekten çözümün sadece yarısını sağladı, ancak sizin "2934" ü "0xB76" ya çevirdiniz. Bu hiç de kötü bir çözüm değil, ama sorulan sorunun cevabı değil.
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

19
string HexFromID(int ID)
{
    return ID.ToString("X");
}

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

Yine de bunun değerini gerçekten sorgularım. Belirttiğiniz hedef, değeri kısaltmaktır, ki bu olacaktır, ancak bu kendi başına bir hedef değildir. Gerçekten hatırlamayı kolaylaştıracak veya yazmayı kolaylaştıracaksınız.

Hatırlamak daha kolaysa, geri adım atıyorsunuz. Hala aynı boyutta olduğunu biliyoruz, sadece farklı kodlanmış. Ancak kullanıcılarınız harflerin 'A-F' ile sınırlı olduğunu bilmeyecek ve bu nedenle kimlik onlar için 'AZ' harfine izin verilmiş gibi aynı kavramsal alanı kaplayacak. Yani, bir telefon numarasını ezberlemek yerine, daha çok bir GUID'yi (eşdeğer uzunlukta) ezberlemek gibidir.

Yazmak istiyorsanız, kullanıcı tuş takımını kullanmak yerine artık klavyenin ana bölümünü kullanmalıdır. Yazması daha zor olacak, çünkü parmaklarının tanıdığı bir kelime olmayacak.

Daha iyi bir seçenek, gerçek bir kullanıcı adı seçmelerine izin vermektir.


Amaç gerçekten daha az karakter almak. Örneğin sadece 140 karakter mesajına izin verdikleri yerlerde twitter alın. Benzer bir şey yapıyoruz, bu yüzden kullanıcılarımıza kullanıcı kimliklerini kısaltmanın bir yolunu vermeye çalışıyoruz.
codette

3
Bu durumda, ikili bir temsili düşünmelisiniz. Bu, sadece negatif kısmı kullanmayan 32 bit int, yani 16 bit çözünürlük anlamına geliyor. Bunu tek bir unicode karaktere kolayca koyabilirsiniz.
Joel Coehoorn

5
Gecikmiş yanıt, ancak - asla negatif sayılar içermeyen 32 bit (işaretli) bir int, 16 değil, 31 bit çözünürlüğe sahiptir. Bunu, bir unicode karaktere doldurabilirsiniz, ancak UTF8 kodlandığında, 0 ile 127 arasında olmadığı sürece hex eşdeğerinden daha fazla karakter alacaktır. HEX bu sorun için korkunç bir çözüm değil, ancak int içindeki dört bayttan bir base64 daha da kısa olurdu (ve dolguları kesebilirsiniz)
James Hart

Evet, orada bir beyin osuruğu vardı. Keşke bir yorumu düzenleyebilseydim.
Joel Coehoorn

15

Onaltılıya:

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

İnt için:

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

7

Bu cevabı bulmadan önce int'i Hex dizgisine ve geri dönüştürmek için kendi çözümümü oluşturdum. Şaşırtıcı olmayan bir şekilde, daha az kod yükü olduğundan .net çözümünden oldukça hızlıdır.

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

Zamanlama kodu:

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

Sonuçlar:

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

1

NET ÇERÇEVE

Çok iyi açıklanmış ve birkaç programlama hattı İYİ İŞ

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

Eski okuldan bir şey pascal C # dönüştürülmüş çok eski prosedürü

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

2
Cevabınız için teşekkür ederim. Mümkünse lütfen olabildiğince İngilizceye tercüme edin. Herhangi bir dilbilgisi hatası için endişelenmeyin, bunları düzeltiriz.
bcperth


-5

int on hex:

int a = 72;

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

hex'den int'e:

int b = 0xB76;

Console.WriteLine (b);

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.