2009-07-16 15 views
356

मैं निम्नलिखित को कैसे परिवर्तित कर सकता हूं?सी # हेक्स में पूर्णांक कनवर्ट करें और फिर से वापस

2934 (पूर्णांक) B76 (हेक्स) के लिए

मुझे समझाने मैं क्या करने की कोशिश कर रहा हूँ करते हैं। मेरे पास मेरे डेटाबेस में उपयोगकर्ता आईडी हैं जो पूर्णांक के रूप में संग्रहीत हैं। उपयोगकर्ताओं को उनकी आईडी का संदर्भ देने के बजाय मैं उन्हें हेक्स मान का उपयोग करना चाहता हूं। मुख्य कारण यह है कि यह छोटा है।

इसलिए मुझे केवल पूर्णांक से हेक्स तक जाने की आवश्यकता नहीं है, लेकिन मुझे हेक्स से पूर्णांक तक जाने की भी आवश्यकता है।

क्या सी # में ऐसा करने का कोई आसान तरीका है?

+51

एफवाईआई, आप न्यूमेरिक कीपैड उपयोगकर्ताओं को अपमानित करेंगे। –

+0

आपके पास एक अच्छी बात है। लेकिन हम पूर्णांक आईडी को उस चीज़ में बदलने की कोशिश कर रहे हैं जो कम वर्ण लेता है। अंतर्दृष्टि के लिए धन्यवाद। – codette

+1

@ कोडेट संख्याओं के रूप में संख्याओं को संग्रहित करना अभी भी पठनीय होने पर कम से कम स्थान लेगा। उदाहरण के लिए, 2bln (पूर्णांक) तक की संख्या के लिए 4 बाइट्स। या यदि यह किसी भी संख्यात्मक प्रकार के लिए बहुत लंबा है, तो बाइनरी फ़ील्ड का उपयोग करें। – Luc

उत्तर

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

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

+148

आप उपयोग करके अंकों की संख्या भी निर्दिष्ट कर सकते हैं: decValue.ToString ("X4") – Martin

+62

चूंकि इसका उल्लेख यहां नहीं किया गया है: यदि आप लोकेस x (उदाहरण के लिए ToString ("x4) का उपयोग करते हैं तो आपको लोअरकेस हेक्स मान मिलता है (उदाहरण के लिए बी 76)। – Skalli

+0

यह वास्तव में वह जवाब है जिसे मैं ढूंढ रहा था, मार्टिन! – MelloG

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

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

मैं वास्तव में इस के मूल्य पर सवाल करता हूं। आपको बताया गया है कि मूल्य कम करना है, जो यह होगा, लेकिन यह अपने आप में एक लक्ष्य नहीं है। आप वास्तव में या तो याद रखना आसान या टाइप करना आसान बनाते हैं।

यदि आपको याद रखना आसान है, तो आप पीछे एक कदम उठा रहे हैं। हम जानते हैं कि यह अभी भी वही आकार है, जो अलग-अलग एन्कोड किया गया है। लेकिन आपके उपयोगकर्ताओं को यह नहीं पता होगा कि पत्र 'ए-एफ' तक सीमित हैं, और इसलिए आईडी उनके लिए एक ही वैचारिक स्थान पर कब्जा कर लेगी जैसे कि 'ए-जेड' पत्र की अनुमति थी। तो एक टेलीफोन नंबर याद रखने की बजाय, यह एक GUID (बराबर लंबाई के) याद रखने की तरह है।

यदि आप टाइपिंग का मतलब रखते हैं, तो कीपैड का उपयोग करने में सक्षम होने के बजाय उपयोगकर्ता को अब कीबोर्ड के मुख्य भाग का उपयोग करना होगा। यह टाइप करना अधिक कठिन होने की संभावना है, क्योंकि यह उनकी उंगलियों को पहचानने वाला शब्द नहीं होगा।

वास्तव में उन्हें वास्तविक उपयोगकर्ता नाम चुनने का एक बेहतर विकल्प है।

+0

लक्ष्य वास्तव में कम वर्ण लेने के लिए है। उदाहरण के लिए ट्विटर ले लो जहां वे केवल 140 वर्ण संदेशों की अनुमति देते हैं। हम कुछ ऐसा ही कर रहे हैं ताकि हम अपने उपयोगकर्ताओं को अपनी यूजर आईडी को छोटा करने का एक तरीका दे सकें। – codette

+3

उस स्थिति में, आपको बाइनरी प्रतिनिधित्व के बारे में सोचना चाहिए। यह 32 बिट इंट की संभावना है जो सिर्फ नकारात्मक भाग का उपयोग नहीं करता है, जिसका मतलब संकल्प के 16 बिट्स है। आप इसे एक यूनिकोड चरित्र में आसानी से रख सकते हैं। –

+5

बेल्ट प्रतिक्रिया, लेकिन - 32 बिट (हस्ताक्षरित) int जिसमें कभी भी नकारात्मक संख्याएं नहीं होती हैं, संकल्प के 31 बिट्स हैं, 16 नहीं। आप इसे एक यूनिकोड चरित्र में भरने में सक्षम हो सकते हैं, लेकिन जब यह यूटीएफ 8 एन्कोड किया जाता है, जब तक कि यह 0 के बीच न हो और 127 यह हेक्स समकक्ष की तुलना में अधिक पात्रों को लेने जा रहा है। हेक्स इस समस्या के लिए एक भयानक समाधान नहीं है, लेकिन int में चार बाइट्स का बेस 64 भी छोटा होगा (और आप पैडिंग को ट्रिम कर सकते हैं) –

49

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

बहुत यकीन नहीं है कि मैं -1 के लायक क्यों हूं लेकिन मुझे लगता है कि मैंने किसी को नाराज किया। – JaredPar

+0

हो सकता है कि उन्हें प्रारूप में वर्तनी के साथ कोई समस्या हो? O_o –

+9

या "0x" बिट, जो कुछ ऐसा है जो ओपी वास्तव में –

13

से हेक्स के लिए हेक्स के लिए यह कन्वर्ट करने के लिए निम्नलिखित का प्रयास करें:

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

पूर्णांक पर:

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

एक फैशनेबल विलम्बित प्रतिक्रिया है, लेकिन आप कार्यान्वयन को छोटा करने Integer किसी प्रकार का विचार किया है? यदि एकमात्र लक्ष्य उपयोगकर्ता आईडी को जितना संभव हो सके छोटा करना है, तो मुझे यह जानने में दिलचस्पी होगी कि क्या कोई अन्य स्पष्ट कारण है कि आपको विशेष रूप से हेक्साडेसिमल रूपांतरण की आवश्यकता क्यों है - जब तक कि मैं इसे बिल्कुल याद नहीं करता। क्या यह स्पष्ट और ज्ञात है (यदि आवश्यक हो) कि उपयोगकर्ता आईडी वास्तव में वास्तविक मूल्य का हेक्साडेसिमल प्रतिनिधित्व है?

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

मैंने int को हेक्स स्ट्रिंग में परिवर्तित करने के लिए अपना स्वयं का समाधान बनाया और मुझे यह जवाब मिलने से पहले वापस मिला। आश्चर्य की बात नहीं है, यह .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 
-3

पूर्णांक हेक्स के लिए:

पूर्णांक एक = 72;

कंसोल। राइटलाइन ("{0: एक्स}", ए);

हेक्स int करने के लिए:

पूर्णांक ख = 0xB76;

कंसोल। राइटलाइन (बी);

संबंधित मुद्दे