Chuyển đổi số nguyên thành thập lục phân và trở lại một lần nữa


461

Làm thế nào tôi có thể chuyển đổi sau đây?

2934 (số nguyên) đến B76 (hex)

Hãy để tôi giải thích những gì tôi đang cố gắng làm. Tôi có ID người dùng trong cơ sở dữ liệu của mình được lưu trữ dưới dạng số nguyên. Thay vì để người dùng tham chiếu ID của họ, tôi muốn cho họ sử dụng giá trị hex. Lý do chính là vì nó ngắn hơn.

Vì vậy, tôi không chỉ cần chuyển từ số nguyên sang hex mà tôi còn cần phải chuyển từ hex sang số nguyên.

Có một cách dễ dàng để làm điều này trong C #?


65
FYI, bạn sẽ xúc phạm người dùng bàn phím số.
Daniel A. White

1
Bạn có một điểm tốt. Nhưng chúng tôi đang cố gắng chuyển đổi số nguyên ID thành thứ gì đó chiếm ít ký tự hơn. Cảm ơn sự thấu hiểu tho.
codette

Một phản ứng muộn màng thời trang, nhưng bạn đã xem xét một số loại Integerthực hiện rút ngắn? Nếu mục tiêu duy nhất là làm cho ID người dùng càng ngắn càng tốt, tôi muốn biết liệu có lý do rõ ràng nào khác tại sao bạn đặc biệt yêu cầu chuyển đổi thập lục phân - tất nhiên trừ khi tôi bỏ lỡ nó. Có rõ ràng và được biết (nếu có yêu cầu) rằng ID người dùng trên thực tế là một đại diện thập lục phân của giá trị thực?
WynandB

1
@codette Lưu số dưới dạng số sẽ chiếm ít không gian nhất trong khi vẫn có thể đọc được. Ví dụ: 4 byte cho các số lên tới 2bln (số nguyên). Hoặc nếu quá dài cho bất kỳ loại số nào, hãy sử dụng trường nhị phân.
Luc

9
@Luc Các trạng thái OP Tôi có ID người dùng trong cơ sở dữ liệu của mình được lưu trữ dưới dạng số nguyên. Thay vì để người dùng tham chiếu ID của họ, tôi muốn cho họ sử dụng giá trị hex. vì vậy codette đang lưu trữ các giá trị dưới dạng int, nhưng chuyển đổi thành / từ hex cho người dùng.
Trisped

Câu trả lời:


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

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


179
bạn cũng có thể chỉ định số chữ số bằng cách sử dụng: decValue.ToString ("X4")
Martin

78
Vì điều này chưa được đề cập ở đây: Nếu bạn sử dụng lowecase x (ví dụ ToString ("x4), bạn sẽ nhận được giá trị hex chữ thường (ví dụ: b76).
Skalli

14
Tôi có phải là người duy nhất gặp khó khăn trong việc chấp nhận tên biến "decValue" không vì nó không phải là số thập phân? Xin lỗi người đàn ông, tôi biết nó là từ một nguồn khác, nhưng stackoverflow nên tốt hơn thế.
Christopher Bonitz

8
@bonitzenator lol, trong 6 năm câu trả lời này đã tồn tại, tôi chưa bao giờ nhận thấy điều đó. Đã cập nhật!
Gavin Miller

1
Lưu ý rằng giải pháp hex to int của bạn sẽ tạo ra các số nguyên có chữ ký và tối đa hóa ở 8 ký tự hex.
Scott Solmer


60

Hãy thử làm như sau để chuyển đổi nó thành hex

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

Và trở lại

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

Không chắc chắn lắm tại sao tôi xứng đáng -1 nhưng tôi đoán tôi đã xúc phạm ai đó.
JaredPar

9
hoặc bit "0x", đó là điều mà OP không thực sự muốn
Philippe Leybaert

3
tôi đã sửa lỗi chính tả định dạng - nhưng không downvote. downvote không có lời giải thích làm tôi khó chịu quá ...
Scott Ivey

@Philippe, có lẽ nhưng nó có vẻ như là một điều rất ngớ ngẩn để downvote cho. Đặc biệt là xem xét một nửa câu trả lời ban đầu không có hex -> int part
JaredPar 16/07/2012

8
(Tôi đã xin lỗi tôi đã nhận xét). Câu hỏi là "làm thế nào để tôi chuyển đổi 2934 thành B76". Các câu trả lời khác thực sự chỉ cung cấp một nửa giải pháp, nhưng "2934" đã được chuyển đổi thành "0xB76". Đó không phải là một giải pháp tồi, nhưng nó không phải là một câu trả lời cho câu hỏi được hỏi.
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);
}

Tôi thực sự đặt câu hỏi về giá trị của điều này, mặc dù. Mục tiêu đã nêu của bạn là làm cho giá trị ngắn hơn, nhưng nó sẽ không phải là mục tiêu. Bạn thực sự có nghĩa là làm cho nó dễ nhớ hơn hoặc dễ gõ hơn.

Nếu bạn có nghĩa là dễ nhớ hơn, thì bạn đang lùi một bước. Chúng tôi biết nó vẫn có cùng kích thước, chỉ được mã hóa khác nhau. Nhưng người dùng của bạn sẽ không biết rằng các chữ cái được giới hạn ở 'A-F', và do đó ID sẽ chiếm cùng một không gian khái niệm cho chúng như thể chữ cái 'AZ' được cho phép. Vì vậy, thay vì giống như ghi nhớ số điện thoại, nó giống như ghi nhớ GUID (có độ dài tương đương).

Nếu bạn muốn gõ, thay vì có thể sử dụng bàn phím, giờ đây người dùng phải sử dụng phần chính của bàn phím. Nó có thể khó gõ hơn, bởi vì đó sẽ không phải là một từ mà ngón tay của họ nhận ra.

Một lựa chọn tốt hơn nhiều là thực sự cho phép họ chọn một tên người dùng thực sự.


Mục tiêu thực sự là chiếm ít nhân vật hơn. Lấy twitter làm ví dụ nơi họ chỉ cho phép 140 tin nhắn ký tự. Chúng tôi đang làm một cái gì đó tương tự vì vậy chúng tôi đang cố gắng cung cấp cho người dùng cách rút ngắn ID người dùng của họ.
codette

3
Trong trường hợp đó, bạn nên nghĩ về một biểu diễn nhị phân. Đây có thể là int 32 bit mà không sử dụng phần âm, nghĩa là độ phân giải 16 bit. Bạn có thể đặt nó trong một ký tự unicode khá dễ dàng.
Joel Coehoorn

5
Phản hồi được tin tưởng, nhưng - một int 32 bit (đã ký) không bao giờ chứa số âm có độ phân giải 31 bit, không phải 16. Bạn có thể nhét nó vào một ký tự unicode, nhưng khi nó được mã hóa UTF8, trừ khi nó nằm trong khoảng từ 0 đến 127 nó sẽ chiếm nhiều ký tự hơn tương đương hex. HEX không phải là một giải pháp khủng khiếp cho vấn đề này, nhưng một cơ sở 64 trong số bốn byte trong int thậm chí còn ngắn hơn (và bạn có thể cắt bớt phần đệm)
James Hart

Vâng, tôi đã bị rắm não ngay tại đó. Tôi ước tôi có thể chỉnh sửa một bình luận.
Joel Coehoorn

15

Tới Hex:

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

Để int:

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

7

Tôi đã tạo giải pháp của riêng mình để chuyển đổi int thành chuỗi Hex và quay lại trước khi tôi tìm thấy câu trả lời này. Không có gì đáng ngạc nhiên, nó nhanh hơn đáng kể so với giải pháp .net vì có ít chi phí mã hơn.

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

Mã thời gian:

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

Các kết quả:

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

NỀN TẢNG NET

Giải thích rất tốt và vài dòng lập trình CÔNG VIỆC TỐT

// 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/doad/Software/Seagate/St_mem.pas

Một cái gì đó từ thủ tục cũ của pascal đã chuyển đổi thành 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
Cảm ơn bạn đã trả lời. Nếu có thể xin vui lòng dịch sang tiếng Anh tốt nhất bạn có thể. Đừng lo lắng về bất kỳ lỗi ngữ pháp có thể, chúng tôi sẽ sửa chúng.
22 giờ 50 phút


-5

int đến hex:

int a = 72;

Bảng điều khiển.WriteLine ("{0: X}", a);

hex đến int:

int b = 0xB76;

Bảng điều khiển.WriteLine (b);

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.