हेक्स स्ट्रिंग को इंट में कन्वर्ट करें


111

मैं एक स्ट्रिंग में 8 अक्षर लंबे हेक्स कोड को एक पूर्णांक में बदलने की कोशिश कर रहा हूं, ताकि मैं बहुत अधिक भिन्न मूल्यों पर स्ट्रिंग तुलनाओं के बजाय अंतर तुलना कर सकूं।

मुझे पता है कि यह C ++ में काफी तुच्छ है, लेकिन मुझे इसे जावा में करने की आवश्यकता है। मुझे जिस टेस्ट केस को संतुष्ट करना है वह अनिवार्य रूप से "AA0F245C" को इंट में और फिर वापस उस स्ट्रिंग में बदलना है ताकि मुझे पता चले कि यह सही में परिवर्तित हो रहा है।

मैंने निम्नलिखित कोशिश की है:

int decode = Integer.decode("0xAA0F245C");  // NumberFormatException
int decode2 = Integer.decode("AA0F245C"); //NumberFormatException
int parseInt = Integer.parseInt("AA0F245C", 16); //NumberFormatException
int valueOf = Integer.valueOf("AA0F245C", 16); //NumberFormatException

मैंने एक समय में दो वर्णों को करने और परिणामों को गुणा करने की कोशिश की है, जो रूपांतरण कार्य करता है लेकिन संख्या सही नहीं है।

int id = 0;
for (int h = 0; h < hex.length(); h= h+2)
{
    String sub = hex.subSequence(h, h+2).toString();

if (id == 0)
    id = Integer.valueOf(sub, 16);
else
    id *= Integer.valueOf(sub, 16);             
 }
//ID = 8445600 which = 80DEA0 if I convert it back. 

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

आपकी सहायता के लिए अग्रिम रूप से धन्यवाद।


जब आप शिफ्टिंग होनी चाहिए तो आप गुणा कर रहे हैं।
नाथन मोइनवाज़िरी

7
0xAA0F245C = 2853119068लेकिनInteger.MAX_VALUE = 0x7fffffff = 2147483647
Pshemo

5
मुझे पता है कि सवाल दो साल से है। हालांकि, जावा 8 एक और समाधान सक्षम करता है। उन्होंने वह Integer.parseUnsignedInt("value",radix)तरीका जोड़ा जो आपके उद्देश्य की पूर्ति करता है। यदि मान इससे अधिक है तो Integer.MAX_VALUEइसे ऋणात्मक संख्या में मैप किया जाता है।
जॉन

जवाबों:


151

यह केवल एक इंट (जो 4 बाइट्स है और हस्ताक्षरित है) के लिए बहुत बड़ा है।

उपयोग

Long.parseLong("AA0F245C", 16);

4
बहुत बढ़िया धन्यवाद! मुझे शायद यही पता होना चाहिए था। लेकिन इससे मुझे लगता है कि जिन 4 लोगों को मैंने पोस्ट करने से पहले पूछा था उनमें से कोई भी इसे बेहतर नहीं जानता था :)। एक साइड नोट के रूप में, मुझे अब यह पता लगाना है कि उस व्यक्ति ने कोड क्यों लिखा है कि मुझे किलों की तुलना किलों के रूप में करनी है और लंबी नहीं है ... जिसका मतलब है कि कुछ और है। इस बिंदु के अलावा ... त्वरित उत्तर के लिए धन्यवाद !!!! अपने भयानक त्रुटि संदेश के लिए आपको जावा को शाप देते हैं ... "यह बड़ा है" सहायक होता।
रोलोक

जब मैं बड़ी हेक्स स्ट्रिंग के साथ कोशिश करता हूं, तो मुझे मिलता है NumberFormatException: For input string: "AF0005E2A6C630059E4754B8799360F5"... समाधान?
ओम् शेराज़

@AnumSheraz आप एक लंबे लेकिन बाइट सरणी में परिवर्तित नहीं करना चाहते हैं। उदाहरण के लिए देखें stackoverflow.com/questions/140131/…
Denys Séguret

बड़ी संख्या के लिए बाइट सरणी में परिवर्तित करने का एक विकल्प BigIntegerइस तरह वर्ग का उपयोग करना है :BigInteger value = new BigInteger(valueString, 16)
जावरु

33

आप इस तरह का उपयोग कर सकते हैं

System.out.println(Integer.decode("0x4d2"))    // output 1234
//and vice versa 
System.out.println(Integer.toHexString(1234); //  output is 4d2);

1
मुझे यह उत्तर पसंद है, पता नहीं था कि इंटेगर वर्ग में इसके लिए एक सामान्य, टाइपिनेंसिव विधि है। ज्ञान के लिए धन्यवाद।
Gewure

18

एक जावा Integerको संभालने वाला अधिकतम मूल्य 2147483657, या 2 ^ 31-1 है। हेक्साडेसिमल संख्या AA0F245C एक दशमलव संख्या के रूप में 2853119068 है, और यह बहुत बड़ी है, इसलिए आपको उपयोग करने की आवश्यकता है

Long.parseLong("AA0F245C", 16);

यह काम करने के लिए।


बंद: दिलचस्प है कि 5 मिनट बाद एक अधिक विस्तृत जवाब 14. की तुलना में केवल 1 अपवॉट हो जाता है। हालांकि यह सच है, यह एक जादुई '4 बाइट्स' और 'हस्ताक्षरित' नहीं कहा ... एचएम।
n611x007


5

यह सही जवाब है:

myPassedColor = "#ffff8c85" int colorInt = Color.parseColor(myPassedColor)


3

आप में से जिन्हें दो-चरित्र स्ट्रिंग से बाइट में हेक्साडेसिमल प्रतिनिधित्व को बाइट में बदलने की आवश्यकता है (जो कि जावा में हमेशा हस्ताक्षरित होता है), एक उदाहरण है। हेक्साडेसिमल स्ट्रिंग को पार्स करने से कभी भी ऋणात्मक संख्या नहीं मिलती है, जो कि दोषपूर्ण है, क्योंकि 0xFF कुछ बिंदुओं से -1 है (दो का पूरक कोडिंग)। सिद्धांत आने वाले स्ट्रिंग को इंट के रूप में पार्स करना है, जो बाइट से बड़ा है, और फिर नकारात्मक संख्याओं के आसपास लपेटता है। मैं केवल बाइट्स दिखा रहा हूं, ताकि उदाहरण काफी छोटा हो।

String inputTwoCharHex="FE"; //whatever your microcontroller data is

int i=Integer.parseInt(inputTwoCharHex,16);
//negative numbers is i now look like 128...255

// shortly i>=128
if (i>=Integer.parseInt("80",16)){

    //need to wrap-around negative numbers
    //we know that FF is 255 which is -1
    //and FE is 254 which is -2 and so on
    i=-1-Integer.parseInt("FF",16)+i;
    //shortly i=-256+i;
}
byte b=(byte)i;
//b is now surely between -128 and +127

इसे अधिक संख्या में संसाधित करने के लिए संपादित किया जा सकता है। बस अधिक एफएफ या क्रमशः 00 जोड़ें। 8 हेक्स-कैरेक्टर पर हस्ताक्षर किए गए पूर्णांकों को पार्स करने के लिए, आपको Long.parseLong का उपयोग करने की आवश्यकता है, क्योंकि FFFF-FFFF, जो पूर्णांक -1 है, एक सकारात्मक संख्या के रूप में प्रस्तुत किए जाने पर पूर्णांक में फिट नहीं होगा (429496795 देता है)। इसलिए आपको इसे स्टोर करने के लिए लॉन्ग की जरूरत है। ऋणात्मक संख्या में रूपांतरण और वापस इंटेगर में डालने के बाद, यह फिट होगा। कोई 8 वर्ण हेक्स स्ट्रिंग नहीं है, जो अंत में पूर्णांक फिट नहीं होगा।


1

सुझाए गए लोगों के लिए एक अतिरिक्त विकल्प, BigIntegerकक्षा का उपयोग करना है । चूंकि हेक्स मान अक्सर बड़ी संख्या में होते हैं, जैसे कि sha256 या sha512 मान, वे आसानी से एक intऔर एक अतिप्रवाह करेंगे long। बाइट सरणी में कनवर्ट करते समय अन्य उत्तर के रूप BigIntergerमें एक विकल्प होता है, जावा में अक्सर भूल जाने वाले वर्ग के रूप में भी एक विकल्प है।

String sha256 = "65f4b384672c2776116d8d6533c69d4b19d140ddec5c191ea4d2cfad7d025ca2";
BigInteger value = new BigInteger(sha256, 16);
System.out.println("value = " + value);
// 46115947372890196580627454674591875001875183744738980595815219240926424751266


0

इसके साथ प्रयास करें:

long abc = convertString2Hex ("1A2A3B");

private  long  convertString2Hex(String numberHexString)
{
    char[] ChaArray = numberHexString.toCharArray();
    long HexSum=0;
    long cChar =0;

    for(int i=0;i<numberHexString.length();i++ )
    {
        if( (ChaArray[i]>='0') && (ChaArray[i]<='9') )
            cChar = ChaArray[i] - '0';
        else
            cChar = ChaArray[i]-'A'+10;
        HexSum = 16 * HexSum + cChar;
    }
    return  HexSum;
}
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.