2009-08-17 10 views
12

मुझे जावा प्रोग्राम को कोड करना होगा जो नेटवर्क से संदेश प्राप्त करेगा और उपयोगकर्ता को अपनी सामग्री प्रदर्शित करेगा। समस्या यह है कि मुझे प्राप्त संदेश सी संरचनाओं के बाइनरी डंप हैं। इसमें कुछ संदेश छोटे एंडियन मशीनों से आ रहे हैं और कुछ बड़े एंडियन से हैं, बिना फ़ील्ड को नेटवर्क बाइट ऑर्डर में परिवर्तित किया जा रहा है। मेरे पास एक तरीका है जेएनआई का उपयोग करना और सी एक्सट्रैक्ट्स को कुछ एक्सएमएल स्ट्रिंग में कनवर्ट करना और उसके बाद इस ऑब्जेक्ट स्ट्रिंग को जावा ऑब्जेक्ट में क्रमबद्ध करना है। यह एक श्रमिक नौकरी है क्योंकि लगभग 122 विभिन्न structs और उनमें से प्रत्येक में 20 से अधिक फ़ील्ड हैं। मुझे आश्चर्य है कि पुस्तकालय/उपकरण/पद्धति है जो मेरी नौकरी को थोड़ा आसान बना सकती है?जावा में सी स्ट्रक्चर का उपयोग

+0

क्या आप किसी भी नेटवर्क का उपयोग कर किसी भी मौके से हैं? यदि ऐसा है, तो डीबीसी फ़ाइल को पार्स करना सबसे अच्छा समाधान होगा। – gramm

+0

दुर्भाग्यवश यह एक उचित दूरसंचार प्रणाली है। मैं एक डीबग टूल लिख रहा हूं जो सिस्टम के आंतरिक मॉड्यूल के बीच संदेशों को आदान-प्रदान कर देगा .. कॉल प्रवाह आरेख की तरह। – Rohin

उत्तर

4

Swig जावा ऑब्जेक्ट्स में सी structs मैपिंग के संदर्भ में आपके लिए बहुत कठिन दोहराव वाले काम को संभालेगा। Swig/Java manual और wrapping C structures पर प्रविष्टि देखें।

+0

धन्यवाद ब्रायन, मुझे लगता है कि स्विग निश्चित रूप से सहायता करेगा – Rohin

4

आप InputStream से डेटा लोड करने के लिए DataInputStream का उपयोग कर सकते हैं। जब तक आप अपने structs के सटीक लेआउट को जानते हैं, यह पर्याप्त होना चाहिए।

5

कई पुस्तकालय हैं जो इस क्षेत्र में सहायता करते हैं। उपयोग करने के लिए सबसे सरल (एनोटेशन ड्राइवर) निश्चित रूप से Preon

+0

दोह, मुझे इसे हराया। मुझे लंबे उत्तर –

+0

लिखने से पहले अधिक ध्यान से पढ़ने की आवश्यकता है, लेकिन आपका उत्तर ** बेहतर ** – dfa

1

java.nio में बाइटबफर है, जो आवश्यक होने पर पढ़ने और लिखने पर उड़ान भरने के बाइट ऑर्डर का समर्थन करता है।

8

प्रीऑन नामक एक लाइब्रेरी है जिसे आपको इस प्रकार के कार्य में मदद करने के लिए डिज़ाइन किया गया था: Preon site असल में, वे आपके pojo में प्रत्येक फ़ील्ड से जुड़ी टिप्पणियों में बाइनरी स्ट्रीम से अपने pojo पढ़ने के लिए सभी तर्क रखने की कोशिश करते हैं।

उनके डॉक्स से एक उदाहरण है जहाँ आप पूर्णांक आप पढ़ रहे हैं के आकार को नियंत्रित:

class Rectangle 
{ 
    @BoundNumber(size="16") private int x1; 
    @BoundNumber(size="16") private int y1; 
    @BoundNumber(size="16") private int x2; 
    @BoundNumber(size="16") private int y2; 
} 

या निर्दिष्ट करने के लिए endianness:

class Rectangle 
{ 
    @BoundNumber(byteOrder=LittleEndian) private int x1; 
    @BoundNumber(byteOrder=LittleEndian) private int y1; 
    @BoundNumber(byteOrder=LittleEndian) private int x2; 
    @BoundNumber(byteOrder=LittleEndian) private int y2; 
} 

तुम भी करने के लिए संदर्भ के साथ उपयोग कर सकते हैं मिनी समीकरण आकार/लंबाई, आदि निर्दिष्ट करने के लिए पिछले फ़ील्ड में मान

@BoundList(size="width * height") byte[] pixels; 
@BoundNumber(size="nrBits * 2") int value; 

ओह, और वे एलएसओ सशर्त तर्क प्रदान करते हैं, सभी एनोटेशन में।

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