2009-07-16 82 views
356

Làm thế nào tôi có thể chuyển đổi những điều sau đây?C# chuyển đổi số nguyên thành hex và ngược lại

2934 (số nguyên) thành B76 (hex)

Hãy để tôi giải thích những gì tôi đang cố gắng làm. Tôi có User ID 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, không chỉ tôi cần phải đi từ số nguyên đến hex nhưng tôi cũng cần phải đi từ hex đến số nguyên.

Có cách nào dễ dàng để thực hiện việc này trong C# không?

+51

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

+0

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 vì sự thấu hiểu tho. – codette

+1

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

Trả lời

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

+148

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

+62

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

+0

Đó thực sự là câu trả lời tôi đang tìm kiếm, Martin! – MelloG

17
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. Bạn đang nói mục tiêu là làm cho giá trị ngắn hơn, nó sẽ làm gì, nhưng đó không phải là một mục tiêu trong chính nó. Bạn thực sự có nghĩa là làm cho nó dễ dàng hơn để ghi nhớ hoặc dễ dàng hơn để gõ.

Nếu bạn có nghĩa là dễ nhớ hơn, thì bạn đang lùi 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 bị giới hạn ở 'A-F', và vì vậy ID sẽ chiếm cùng một không gian khái niệm cho chúng như thể chữ cái 'A-Z' được cho phép. Vì vậy, thay vì giống như ghi nhớ một số điện thoại, nó giống như ghi nhớ một GUID (có chiều dài tương đương).

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

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

+0

Mục tiêu thực sự là lấy ít ký tự hơn. Lấy twitter ví dụ, nơi họ chỉ cho phép 140 tin nhắn nhân vậ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 một 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 suy nghĩ về một biểu diễn nhị phân. Đây có thể là một int 32 bit mà chỉ không sử dụng phần tiêu cực, có nghĩa là 16bits độ phân giải. Bạn có thể đặt nó trong một ký tự unicode khá dễ dàng. –

+5

Phản hồi có liên quan, nhưng - 32 bit (ký) int không bao giờ chứa số âm có 31 bit độ phân giải, chứ không phải 16. Bạn có thể đưa nó vào một ký tự unicode, nhưng khi mã UTF8 được mã hóa, trừ khi nó nằm trong khoảng từ 0 đến 127 nó sẽ chiếm nhiều ký tự hơn so với số hex tương đương. 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 base64 của bốn byte trong int sẽ thậm chí ngắn hơn (và bạn có thể cắt lớp đệm) –

49

Hãy thử những điều sau đây để chuyển đổi nó để hex

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

Và lại một lần nữa

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

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

+0

Có thể họ gặp vấn đề với cách bạn đánh vần định dạng? O_o –

+9

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

13

Để Hex:

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

Để int:

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

Một phản ứng hợp thời trang muộn, nhưng có bạn xem một số loại Integer rút ngắn thực hiệ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 nếu có bất kỳ lý do rõ ràng nào khác khiến bạn đặc biệt yêu cầu chuyển đổi thập lục phân - trừ khi tôi bỏ lỡ nó. Có rõ ràng và được biết đến (nếu có yêu cầu) rằng ID người dùng thực tế là một biểu diễn thập lục phân của giá trị thực?

15
int valInt = 12; 
Console.WriteLine(valInt.ToString("X")); // C ~ possibly single-digit output 
Console.WriteLine(valInt.ToString("X2")); // 0C ~ always double-digit output 
4

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 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. đang

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

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

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

int để hex:

int a = 72;

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

hex để int:

int b = 0xB76;

Console.WriteLine (b);

Các vấn đề liên quan