แปลงจำนวนเต็มเป็นเลขฐานสิบหกและกลับมาอีกครั้ง


461

ฉันจะแปลงสิ่งต่อไปนี้ได้อย่างไร?

2934 (จำนวนเต็ม) ถึง B76 (ฐานสิบหก)

ให้ฉันอธิบายสิ่งที่ฉันพยายามจะทำ ฉันมี ID ผู้ใช้ในฐานข้อมูลของฉันที่เก็บไว้เป็นจำนวนเต็ม แทนที่จะให้ผู้ใช้อ้างอิง ID ของพวกเขาฉันต้องการให้พวกเขาใช้ค่าฐานสิบหก สาเหตุหลักคือเพราะมันสั้นกว่า

ดังนั้นฉันต้องเปลี่ยนจากเลขจำนวนเต็มเป็นฐานสิบหก แต่ฉันต้องเปลี่ยนจากฐานสิบหกเป็นจำนวนเต็มด้วย

มีวิธีง่าย ๆ ใน C # หรือไม่


65
FYI คุณจะทำให้ผู้ใช้แผงปุ่มกดตัวเลขเสียหาย
Daniel A. ขาว

1
คุณมีจุดดี แต่เรากำลังพยายามแปลงเลขจำนวนเต็มเป็นสิ่งที่ใช้อักขระน้อยลง ขอบคุณสำหรับข้อมูลเชิงลึกนี้
codette

การตอบสนองล่าช้าแบบแฟชั่น แต่คุณได้พิจารณาIntegerการใช้งานที่สั้นลงหรือไม่? หากเป้าหมายเดียวคือการทำให้ ID ผู้ใช้สั้นที่สุดเท่าที่จะเป็นไปได้ฉันสนใจที่จะทราบว่ามีเหตุผลอื่นใดที่ชัดเจนว่าทำไมคุณต้องมีการแปลงเลขฐานสิบหกโดยเฉพาะถ้าไม่ได้พลาดแน่นอน มันชัดเจนและเป็นที่รู้จัก (ถ้าจำเป็นต้องใช้) ว่า ID ผู้ใช้นั้นจริงแล้วเป็นการแสดงเลขฐานสิบหกของมูลค่าจริงหรือไม่?
WynandB

1
@Codette การจัดเก็บหมายเลขเป็นตัวเลขจะใช้พื้นที่น้อยที่สุดในขณะที่ยังสามารถอ่านได้ ตัวอย่างเช่น 4 ไบต์สำหรับตัวเลขที่สูงถึง 2bln (จำนวนเต็ม) หรือถ้ามันยาวเกินไปสำหรับประเภทตัวเลขใด ๆ ให้ใช้ฟิลด์ไบนารี
Luc

9
@Luc OP ระบุว่าฉันมี ID ผู้ใช้ในฐานข้อมูลของฉันที่เก็บไว้เป็นจำนวนเต็ม แทนที่จะให้ผู้ใช้อ้างอิง ID ของพวกเขาฉันต้องการให้พวกเขาใช้ค่าฐานสิบหก ดังนั้น codette จะเก็บค่าเป็น int แต่แปลงเป็น / จาก hex สำหรับผู้ใช้
ริป

คำตอบ:


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

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


179
นอกจากนี้คุณยังสามารถระบุจำนวนหลักโดยใช้: decValue.ToString ("X4")
Martin

78
เนื่องจากสิ่งนี้ไม่ได้ถูกกล่าวถึงที่นี่: หากคุณใช้ lowecase x (เช่น ToString ("x4) คุณจะได้รับค่าเลขฐานสิบหกที่ต่ำกว่า (เช่น b76)
Skalli

14
ฉันเป็นคนเดียวที่มีเวลายากที่จะทนกับชื่อตัวแปร "decValue" เพราะไม่ใช่ทศนิยมหรือไม่? ขออภัยที่ฉันรู้ว่ามันมาจากแหล่งอื่น แต่ stackoverflow ควรดีกว่านั้น
Christopher Bonitz

8
@bonitzenator ฮ่า ๆ ใน 6 ปีที่คำตอบนี้มีอยู่ฉันไม่เคยสังเกตว่า Updated!
Gavin Miller

1
โปรดทราบว่าโซลูชันฐานสิบหกถึง int ของคุณจะสร้างจำนวนเต็มลงนามและสูงสุดที่ 8 ตัวอักษรฐานสิบหก
Scott Solmer

111

ใช้:

int myInt = 2934;
string myHex = myInt.ToString("X");  // Gives you hexadecimal
int myNewInt = Convert.ToInt32(myHex, 16);  // Back to int again.

ดูวิธีการ: แปลงระหว่างสตริงเลขฐานสิบหกและประเภทตัวเลข (คู่มือการเขียนโปรแกรม C #)สำหรับข้อมูลและตัวอย่างเพิ่มเติม


60

ลองทำสิ่งต่อไปนี้เพื่อแปลงให้เป็น hex

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

และกลับมาอีกครั้ง

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

ไม่แน่ใจว่าทำไมฉันจึงสมควรได้รับ -1 แต่ฉันคิดว่าฉันไม่พอใจใครบางคน
JaredPar

9
หรือ "0x" บิตซึ่งเป็นสิ่งที่ OP ไม่ได้อยาก
ฟิลิปป์ Leybaert

3
ฉันแก้ไขการสะกดรูปแบบ - แต่ไม่ได้ลงคะแนน downvotes ไม่มีคำอธิบายใดทำให้ฉันไม่พอใจเกินไป ...
สกอตต์ไอวี่ย์

@ ฟิลิปป์บางที แต่มันดูเหมือนว่าเป็นเรื่องที่โง่มากที่จะลงมือทำ โดยเฉพาะอย่างยิ่งเมื่อพิจารณาครึ่งคำตอบนั้นไม่ได้มี hex -> int part
JaredPar

8
(ฉันขอโทษแล้วฉันแสดงความคิดเห็น) คำถามคือ "ฉันจะแปลง 2934 เป็น B76" ได้อย่างไร คำตอบอื่น ๆ มีเพียงครึ่งหนึ่งของวิธีแก้ปัญหา แต่แปลงเป็น "2934" ถึง "0xB76" ของคุณ มันไม่ใช่ทางออกที่ไม่ดีเลย แต่ก็ไม่ใช่คำตอบสำหรับคำถามที่ถูกถาม
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);
}

ฉันถามถึงคุณค่าของสิ่งนี้จริงๆ คุณระบุเป้าหมายคือการทำให้ค่าสั้นลงซึ่งจะเป็นเช่นนั้น แต่นั่นไม่ใช่เป้าหมายในตัวเอง คุณหมายถึงทำให้จำง่ายขึ้นหรือพิมพ์ง่ายขึ้น

หากคุณจำได้ง่ายขึ้นหมายความว่าคุณกำลังถอยหลังไปหนึ่งก้าว เรารู้ว่ามันยังคงมีขนาดเท่ากันเพียงแค่เข้ารหัสแตกต่างกัน แต่ผู้ใช้ของคุณจะไม่ทราบว่าตัวอักษรถูก จำกัด ไว้ที่ 'A-F' และดังนั้น ID จะใช้พื้นที่แนวคิดเดียวกันสำหรับพวกเขาราวกับว่าได้รับอนุญาตให้ใช้ตัวอักษร 'AZ' ดังนั้นแทนที่จะเป็นเหมือนการจดจำหมายเลขโทรศัพท์มันก็เหมือนกับการจดจำ GUID (ความยาวเท่ากัน)

หากคุณหมายถึงการพิมพ์แทนที่จะสามารถใช้แป้นพิมพ์ได้ผู้ใช้จะต้องใช้ส่วนหลักของแป้นพิมพ์ เป็นไปได้ยากที่จะพิมพ์เพราะไม่มีคำที่นิ้วของพวกเขาจดจำได้

ตัวเลือกที่ดีกว่าคือการให้พวกเขาเลือกชื่อผู้ใช้จริง


เป้าหมายคือการใช้อักขระน้อยลง ยกตัวอย่างเช่นที่พวกเขาอนุญาตให้มีเพียง 140 ข้อความเท่านั้น เรากำลังทำสิ่งที่คล้ายกันดังนั้นเราจึงพยายามให้วิธีการย่อ ID ผู้ใช้ของผู้ใช้ให้สั้นลง
codette

3
ในกรณีนี้คุณควรคิดถึงการเป็นตัวแทนไบนารี นี่น่าจะเป็น 32 บิต int ที่ไม่ได้ใช้ส่วนที่เป็นลบนั่นหมายถึงความละเอียด 16 บิต คุณสามารถใส่มันลงในตัวยูนิโค้ดตัวเดียวได้อย่างง่ายดาย
Joel Coehoorn

5
การตอบกลับล่าช้า แต่ - int 32 บิต (เซ็นชื่อ) ที่ไม่เคยมีตัวเลขติดลบมีความละเอียด 31 บิตไม่ใช่ 16 คุณอาจสามารถคัดแยกสิ่งนั้นให้เป็นอักขระยูนิโค้ดตัวเดียว แต่เมื่อเข้ารหัส UTF8 เว้นแต่ว่าจะอยู่ระหว่าง 0 ถึง 127 มันจะใช้เวลามากกว่าตัวละครที่เทียบเท่าฐานสิบหก HEX ไม่ใช่ทางออกที่ยอดเยี่ยมสำหรับปัญหานี้ แต่ base64 ของสี่ไบต์ใน int จะยิ่งสั้นลง (และคุณสามารถตัดขอบ)
James Hart

ใช่ฉันมีสมองผายลมที่นั่น ฉันหวังว่าฉันจะสามารถแก้ไขความคิดเห็น
Joel Coehoorn


7

ฉันสร้างโซลูชันของตัวเองสำหรับการแปลง int เป็น Hex string และย้อนกลับก่อนที่ฉันจะพบคำตอบนี้ ไม่น่าแปลกใจมันเร็วกว่าโซลูชัน. net เนื่องจากมีรหัสค่าใช้จ่ายน้อยลง

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

รหัสเวลา:

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

ผล:

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 FRAMEWORK

อธิบายได้ดีมากและมีการเขียนโปรแกรมไม่กี่บรรทัด GOOD JOB

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

บางอย่างจากโรงเรียนเก่าขั้นตอนเก่าแก่ของปาสกาลแปลงเป็น 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;
        }
    }

2
ขอบคุณที่ตอบ. ถ้าเป็นไปได้โปรดแปลเป็นภาษาอังกฤษให้ดีที่สุด ไม่ต้องกังวลกับความผิดพลาดทางไวยากรณ์ที่เป็นไปได้เราจะแก้ไขให้ถูกต้อง
bcperth


โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.