2012-06-26 7 views
93

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

private static final byte[] CDRIVES = new byte[] { (byte)0xe0, 0x4f, (byte)0xd0, 
    0x20, (byte)0xea, 0x3a, 0x69, 0x10, (byte)0xa2, (byte)0xd8, 0x08, 0x00, 0x2b, 
    0x30, 0x30, (byte)0x9d }; 
private static final byte[] CMYDOCS = new byte[] { (byte)0xba, (byte)0x8a, 0x0d, 
    0x45, 0x25, (byte)0xad, (byte)0xd0, 0x11, (byte)0x98, (byte)0xa8, 0x08, 0x00, 
    0x36, 0x1b, 0x11, 0x03 }; 
private static final byte[] IEFRAME = new byte[] { (byte)0x80, 0x53, 0x1c, 
    (byte)0x87, (byte)0xa0, 0x42, 0x69, 0x10, (byte)0xa2, (byte)0xea, 0x08, 
    0x00, 0x2b, 0x30, 0x30, (byte)0x9d }; 
... 
and so on 

क्या ऐसा कुछ भी है जिसका मैं उपयोग कर सकता हूं जो कम कुशल हो सकता है, लेकिन क्लीनर दिखाई देगा? उदाहरण के लिए :

private static final byte[] CDRIVES = 
    new byte[] { "0xe04fd020ea3a6910a2d808002b30309d" }; 

उत्तर

87

एक समारोह byte[] के लिए एक हेक्सा स्ट्रिंग परिवर्तित करने का उपयोग करना, तुम कर सकते हो

byte[] CDRIVES = hexStringToByteArray("e04fd020ea3a6910a2d808002b30309d"); 

मैं तुम्हें Convert a string representation of a hex dump to a byte array using Java?

में समारोह डेव एल द्वारा परिभाषित का उपयोग सुझाव देंगे मैं इसे यहाँ अधिकतम पठनीयता के लिए सम्मिलित करें:

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

आप CDRIVES static और final देते हैं, तो प्रदर्शन ड्रॉप irrel है EVANT।

6

आप बाइट सरणियों के बजाय, इन मूल्यों को स्टोर करने के लिए जावा UUID वर्ग का उपयोग कर सकते हैं:

UUID 

public UUID(long mostSigBits, 
      long leastSigBits) 

निर्दिष्ट डेटा का उपयोग कर एक नया UUID निर्माण करती है। अधिकांश सिग्बिट यूयूआईडी के सबसे महत्वपूर्ण 64 बिट्स के लिए उपयोग किया जाता है और कम से कम सिग्बिट यूयूआईडी के कम से कम 64 बिट बन जाते हैं।

1

जहां तक ​​एक स्वच्छ प्रक्रिया का सवाल है आप ByteArrayOutputStream वस्तु का उपयोग कर सकते हैं ...

ByteArrayOutputStream bObj = new ByteArrayOutputStream(); 
bObj.reset(); 

// एक का उपयोग कर bObj एक करने के लिए सभी मूल्यों लिखने

bObj.write(byte value) 

// जब किया जाता है तो आप बाइट []

CDRIVES = bObj.toByteArray(); 

// आप सीएमवायडीओसीएस और आईईएफआरएएम के लिए भी इसी प्रक्रिया को दोहरा सकते हैं,

नोट यदि आपके पास वास्तव में छोटी सरणी है तो यह एक कुशल समाधान नहीं है।

27

जावा 6 में, वहाँ एक विधि वास्तव में क्या कर रही है तुम क्या चाहते:

private static final byte[] CDRIVES = javax.xml.bind.DatatypeConverter.parseHexBinary("e04fd020ea3a6910a2d808002b30309d") 

वैकल्पिक रूप से आप इस्तेमाल कर सकते हैं Google Guava:

import com.google.common.io.BaseEncoding; 
private static final byte[] CDRIVES = BaseEncoding.base16().lowerCase().decode("E04FD020ea3a6910a2d808002b30309d".toLowerCase()); 

जब आप छोटे सरणियों का उपयोग कर रहे अमरूद विधि, overkill है । लेकिन अमरूद में ऐसे संस्करण भी हैं जो इनपुट स्ट्रीम को पार्स कर सकते हैं। बड़े हेक्साडेसिमल इनपुट से निपटने पर यह एक अच्छी सुविधा है।

+0

अमरूद उदाहरण नहीं काफी काम लिखा के रूप में - यह 'base16() होने की जरूरत है लोअरकेस (।) .decode (...) 'यदि आपके पास कम केस हेक्स अंक हैं। http://docs.guava-libraries.googlecode.com/git/javadoc/com/google/common/io/BaseEncoding.html#lowerCase() –

+0

@ पीटर डीग्लॉपर अच्छी खोज, मैंने जवाब अपडेट कर दिया है ताकि कोड अब संभाल सके दोनों निचले और ऊपरी केस वर्णों के साथ तार। –

42
byte[] myvar = "Any String you want".getBytes(); 
+38

क्या पोस्टर द्वारा वांछित '{0x00,0x00,0x00,0x00}' (बाइनरी) की बजाय स्ट्रिंग '0000" '' {0x30,0x30,0x30,0x30} '(ASCII) को चालू नहीं करता है? – jww

+6

आप सही सवाल का जवाब नहीं दे रहे हैं। –

+1

और यह 52 upvotes garnered ?! ओई वेई –

-5
byte[] responseBody = "Invalid Domain Alias".getBytes(); 
1

इस परिस्थिति में मेरे पसंदीदा विकल्प org.apache.commons.codec.binary.Hex जो String y हेक्स और बाइनरी के बीच परिवर्तित करने के लिए उपयोगी एपीआई है उपयोग करने के लिए है। उदाहरण के लिए:

  1. Hex.decodeHex(char[] data) जो एक DecoderException फेंकता है अगर वहाँ सरणी में गैर हेक्स चरित्र, या अगर कोई पात्रों में से एक विषम संख्या है।

  2. Hex.encodeHex(byte[] data) ऊपर डीकोड विधि के समकक्ष है, और char[] बाहर थूकता है।

  3. Hex.encodeHexString(byte[] data) जो byte सरणी से String पर वापस परिवर्तित हो जाता है।

उपयोग: Hex.decodeHex("dd645a2564cbe648c8336d2be5eafaa6".toCharArray())

-2
private static final int[] CDRIVES = new int[] {0xe0, 0xf4, ...}; 

और उपयोग के बाद बाइट में बदलने का।

0

कोई पुस्तकालयों के साथ एक समाधान, गतिशील लंबाई लौटे, अहस्ताक्षरित पूर्णांक व्याख्या (नहीं दो के पूरक)

public static byte[] numToBytes(int num){ 
    if(num == 0){ 
     return new byte[]{}; 
    }else if(num < 256){ 
     return new byte[]{ (byte)(num) }; 
    }else if(num < 65536){ 
     return new byte[]{ (byte)(num >>> 8),(byte)num }; 
    }else if(num < 16777216){ 
     return new byte[]{ (byte)(num >>> 16),(byte)(num >>> 8),(byte)num }; 
    }else{ // up to 2,147,483,647 
     return new byte[]{ (byte)(num >>> 24),(byte)(num >>> 16),(byte)(num >>> 8),(byte)num }; 
    } 
}