2010-07-09 5 views
15

क्या जावा में पाइथन के struct.pack के बराबर कोई फ़ंक्शन है जो मुझे इस तरह के मानों को पैक और अनपैक करने की अनुमति देता है? कोर जावा मेंजावा पाइथन के struct.pack के बराबर है?

pump_on = struct.pack("IIHHI", 0, 0, 21, 96, 512) 
+0

इस प्रश्न के लिए एक स्वीकार्य उत्तर होगा? – Xofo

+0

यह पायथन के पैक के बराबर सटीक नहीं है लेकिन शायद यह आपकी मदद करता है: https://github.com/marc-christian-schulze/structs4java –

उत्तर

1

निकटतम सुविधा Serialization है। यह ऑब्जेक्ट को बाइट अनुक्रम और पीछे में परिवर्तित करता है।

+0

आपको विश्वास नहीं कर सकता। यहां तक ​​कि जब मैं जावा को नापसंद करता हूं, वहां सीरियलाइजेशन की तुलना में इस तरह की चीजों को करने में सक्षम होने के करीब कुछ होना चाहिए: सीरियलाइजेशन आपको कोई नियंत्रण नहीं देता है जिस पर वास्तविक बाइट बनाए जा रहे हैं - यह आपको उन बाइट्स के साथ एक ही ऑब्जेक्ट को फिर से बनाने की अनुमति देता है। – jsbueno

+0

डिफ़ॉल्ट रूप से यह आपको कोई नियंत्रण नहीं देता है, लेकिन आप इसे हमेशा अनुकूलित कर सकते हैं। संकेत: पृष्ठ पर readObject/writeObject के लिए खोजें मैंने आपको एक लिंक दिया है। यदि यह पर्याप्त नहीं है, तो http://download.oracle.com/docs/cd/E17409_01/javase/6/docs/api/java/io/Externalizable.html –

8

मुझे लगता है कि क्या आप के बाद हो सकता है एक ByteBuffer है:

ByteBuffer pump_on_buf = ... 
pump_on_buf.putInt(0); 
pump_on_buf.putInt(0); 
pump_on_buf.putShort(21); 
pump_on_buf.putShort(96); 
pump_on_buf.putInt(512); 
byte[] pump_on = pump_on_buf.array(); 
+0

देखें बाइटबफर आपको स्ट्रिंग्स लिखने की अनुमति नहीं देता है, और ठेकेदार को बफर आकार सीमा की आवश्यकता होती है - आपको यह तय करना होगा कि आपका इनपुट कब तक होगा। – Yonatan

+0

@ योनाटन, यह आपको तार लिखने की अनुमति देता है: 'buf.put (s.getBytes())'। 'बाइटबफर' की शुरुआत में आपको बफर आवंटित करते समय क्षमता निर्दिष्ट करने की आवश्यकता होती है। क्या आप कह रहे हैं कि यह एक अच्छी बात है या बुरी चीज है? – SimonC

+0

@ सिमोनसी बाइटबफर आपको दिखाए गए तरीके से दो लिखने की अनुमति देता है। हालांकि, s.getBytes() स्ट्रिंग (अभी भी चर लंबाई) से एक यूटीएफ -8 एन्कोडेड बाइट सरणी वापस कर देगा। इसमें पिछला शून्य नहीं होगा। उस buf.put() से परे बाइटबफर में वर्तमान स्थिति का उपयोग करता है। यह वही नहीं हो सकता है जो आप चाहते हैं। –

3

कुछ इस तरह:

final DataInputStream stream = new DataInputStream(
    new ByteArrayInputStream(bytes) 
); 
final String user = stream.readUTF(); 
final String password = stream.readUTF(); 
+0

डेटाऑटपुटस्ट्रीम केवल जावा प्राइमेटिव के लिए अच्छा है। ऑब्जेक्टऑटपुटस्ट्रीम (जो डेटाऑटपुट इंटरफेस को भी लागू करता है) आपको प्राइमेटिव्स और सीरियलज़ेबल ऑब्जेक्ट्स लिखने की क्षमता देता है। – Yonatan

1

मैंने शुरू किया:

final ByteArrayOutputStream data = new ByteArrayOutputStream(); 
final DataOutputStream stream = new DataOutputStream(data); 
stream.writeUTF(name); 
stream.writeUTF(password); 
final byte[] bytes = stream.toByteArray(); // there you go 

बाद में, आप उस डेटा को पढ़ सकता है परियोजना का विकास जो पाइथन संरचना के बहुत करीब है: java-binary-block-parserजेबीबीपी में 10 यह

JBBPOut.BeginBin().Int(0,0).Short(21,96).Int(512).End().toByteArray();