2010-07-14 15 views
5

मैं फ़ाइल संरचना पता है, लगता है कि इस संरचना यह है:बाइनरी फ़ाइल से संरचित डेटा पढ़ें -?

[3-bytes long int],[1-byte long unsigned integer],[4-bytes long unsigned integer] 

तो फ़ाइल इस तरह के रिकॉर्ड की जंजीरों में शामिल है।

जावा में इस तरह के एक फ़ाइल को पार्स करने के लिए सबसे elegent तरीका क्या है?

माना जाता है कि हम समग्र लंबाई की बाइट [] सरणी परिभाषित कर सकते हैं और इसे इनपुटस्ट्रीम के साथ पढ़ सकते हैं, लेकिन फिर इसके सबलेमेंट्स को सही पूर्णांक मानों में कैसे परिवर्तित कर सकते हैं?

पहली बात, जावा में बाइट मूल्य पर हस्ताक्षर किए है, हम हमारे मामले में अहस्ताक्षरित मूल्य की जरूरत है। अगली बात, क्या उपयोगी विधियां हैं जो बाइट्स के उप-सरणी को कन्वर्ट करने की अनुमति देती हैं, कहें, बाइट्स 1-सेंट से 4-वें तक सही पूर्णांक मान में?

मुझे पता है कि फ़ंक्शन पैक & पर्ल में अनपैक पैक हैं, जो आपको अभिव्यक्ति के रूप में बाइट्स की एक स्ट्रिंग का प्रतिनिधित्व करने की अनुमति देते हैं, मान लीजिए कि "वीवी" का मतलब 2 हस्ताक्षरित लंबे int मान हैं। आप इस तरह के एक स्ट्रिंग को परिभाषित करने और एक पैक करने के लिए एक तर्क के रूप में यह प्रदान या कार्यों खोल, बाइट्स पैक किया जा करने के लिए/पैक के साथ। जावा/अपाचे libs आदि में ऐसी चीजें हैं?

+0

संभव डुप्लिकेट http://stackoverflow.com/questions/277944/best-way-to-read-structured -binary-फ़ाइलें-साथ-जावा) –

उत्तर

1

आप इस नमूना BinaryReader कक्षा पर एक नज़र डाल सकते हैं जो DataInputStream कक्षा पर आधारित है।

1

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

आप पहले रिकॉर्ड आप

DataInputStream dis = ... 

int a = 0; 
a = dis.readByte(); 
a = a << 8;   
a = a | dis.readByte(); 
a = a << 8; 
a = a | dis.readByte(); 

short b = 0; 
b = dis.readByte(); 

long c = 0; 
c = dis.readByte(); 
c = c << 8; 
c = c | dis.readByte(); 
c = c << 8; 
c = c | dis.readByte(); 
c = c << 8; 
c = c | dis.readByte(); 

जाहिर है (मैं रिकॉर्ड की विशेषताओं के लिए उपयोग कर रहा हूँ क, ख, और ग) इस तरह कुछ करने के लिए आवश्यकता हो सकती है पढ़ने के लिए एक उदाहरण देने के लिए, इस कुछ कथनों को जोड़कर कोड को कड़ा कर दिया जा सकता है, लेकिन आपको सामान्य विचार मिलता है। आपको क्या पता चलेगा कि प्रत्येक विशेषता को पढ़ने के लिए मुझे एक आदिम का उपयोग करना होगा जो आवश्यक से बड़ा है इसलिए कोई ओवरफ़्लो त्रुटियां नहीं हैं। संदर्भ के लिए, जावा में:

  • बाइट = 1 बाइट
  • कम = 16 बिट, 2 बाइट्स
  • पूर्णांक = 32 बिट, 4 बाइट
  • लंबे = 64 बिट्स, 8 बाइट्स
3

@ ब्रायन केली उदाहरण की तरह लेकिन कम। मुझे छोटा पसंद है, लेकिन इसका मतलब स्पष्ट नहीं है, आप तय करते हैं। ;) नोट: readByte() पर हस्ताक्षर किए गए हैं और 0xFF के साथ मुखौटा नहीं होने पर अप्रत्याशित परिणाम होंगे।

DataInputStream dis = ... 

// assuming BIG_ENDIAN format 
int a = dis.read() << 16 | dis.read() << 8 | dis.read(); 
short b = (short) dis.read(); 
long c = dis.readInt() & 0xFFFFFFFFL; 

या

ByteBuffer bb = 
bb.position(a_random_postion); 
int a = (bb.get() & 0xFF) << 16 | (bb.get() & 0xFF) << 8 | (bb.get() & 0xFF); 
short b = (short) (bb.get() & 0xFF); 
long c = bb.readInt() & 0xFFFFFFFFL; 
[जावा के साथ संरचित द्विआधारी फ़ाइलों को पढ़ने में सबसे अच्छा तरीका है] (की
संबंधित मुद्दे