2012-01-17 26 views
30

मैं जावा में नीचे समारोह का उपयोग कर रहा हेक्स प्रारूप में एक एन्क्रिप्टेड स्ट्रिंग परिवर्तित करने के लिए:जावा में, मैं एक हेक्स स्ट्रिंग को बाइट [] में कैसे परिवर्तित करूं?

public static String toHex(byte [] buf) { 
    StringBuffer strbuf = new StringBuffer(buf.length * 2); 
    int i; 
    for (i = 0; i < buf.length; i++) { 
     if (((int) buf[i] & 0xff) < 0x10) { 
      strbuf.append("0"); 
     } 
     strbuf.append(Long.toString((int) buf[i] & 0xff, 16)); 
    } 
    return strbuf.toString(); 
} 

अब मैं वापस एक बाइट सरणी में कि हेक्स स्ट्रिंग परिवर्तित करना चाहते हैं। मैं उसे कैसे कर सकता हूँ?

उदाहरण के लिए,

(1) Plain Text = 123 
(2) Encrypted Text = «h>kq*«¬Mí“~èåZ \}? 
(3) Encrypted Text in Hex = f263575e7b00a977a8e9a37e08b9c215feb9bfb2f992b2b8f11e 

मैं (2) से (3) लिए जा सकते हैं, लेकिन मैं कैसे (2) को वापस (3) से जाते हैं?

+0

aa से Ra। एक मूवी नो कमल चेहे। आप मेरे चैट रूम में मुझसे जुड़ सकते हैं http://chat.stackoverflow.com/rooms/6137/ – Lucifer

+2

बैक बाइट सरणी क्या है? क्या यह एक बाइट सरणी से अलग है? –

+0

नहीं यह बाइट [] के समान है। –

उत्तर

40
String s="f263575e7b00a977a8e9a37e08b9c215feb9bfb2f992b2b8f11e"; 
byte[] b = new BigInteger(s,16).toByteArray(); 
+5

यह मुझे नहीं दिया नतीजा मैं देख रहा था, लेकिन डार्कप्रेन की प्रतिक्रिया में सरल एक-लाइनर विधि थी। –

+0

'cs.setBytes (1, नई BigInteger (regReportId, 16) .toByteArray());' इस काम किया जब मैं Oracle sproc – Dilip

+0

'नई BigInteger (रों, 16) .toByteArray को रॉ डेटाप्रकार पास करना() ; सही नहीं है। मैं 34-लंबाई हेक्स स्ट्रिंग इनपुट करता हूं, और 18-लंबाई बाइट आउटपुट करता हूं। मैं चाहता हूं कि 17-लंबाई बाइट – Ninja

86

स्वीकार किए जाते हैं जवाब अग्रणी शून्य जो समस्याओं

This question जवाब यह कारण हो सकता है पर विचार नहीं करता। इस पर निर्भर करता है कि आप यह देखना चाहते हैं कि यह कैसे किया गया है या जावा अंतर्निर्मित विधि का उपयोग करें। एसओ प्रश्न से क्रमशः this और this उत्तरों से कॉपी किए गए समाधान यहां दिए गए हैं।

विकल्प 1: util विधि

public static byte[] hexStringToByteArray(String s) { 
    int len = s.length(); 
    byte[] data = new byte[len/2]; 
    for (int i = 0; i < len; i += 2) { 
     data[i/2] = (byte) ((Character.digit(s.charAt(i), 16) << 4) 
          + Character.digit(s.charAt(i+1), 16)); 
    } 
    return data; 
} 

विकल्प 2: एक-लाइनर निर्माण में

import javax.xml.bind.DatatypeConverter; 

public static String toHexString(byte[] array) { 
    return DatatypeConverter.printHexBinary(array); 
} 

public static byte[] toByteArray(String s) { 
    return DatatypeConverter.parseHexBinary(s); 
} 
+0

होना चाहिए, आपका उत्तर http://stackoverflow.com/a/25790612/173149 के साथ मेरी सहायता करें, जावा के साथ पहले से प्रदान की जाने वाली कक्षाओं का उपयोग करके एक-लाइनर विकल्प के लिए +1 – gavenkoa

+0

+1 धन्यवाद। – Zeimyth

+0

ग्रेट उत्तर, इच्छा है कि मैं एक से अधिक बार ऊपर उठा सकता हूं। –

5

मैंने पाया कि DatatypeConverter.parseHexBinary अधिक महंगा है (दो बार) से:

org.apache.commons.codec.binary.Hex(str.toCharArray()) 
संबंधित मुद्दे

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