2008-08-21 7 views
27

मेरे पास एक फ़ाइल में बाइनरी डेटा है जिसे मैं बाइट सरणी में पढ़ सकता हूं और बिना किसी समस्या के प्रक्रिया कर सकता हूं। अब मुझे किसी XML दस्तावेज़ में तत्वों के रूप में नेटवर्क कनेक्शन पर डेटा के हिस्सों को भेजने की आवश्यकता है। मेरी समस्या यह है कि जब मैं डेटा को बाइट्स की सरणी से स्ट्रिंग में और बाइट्स की सरणी में वापस परिवर्तित करता हूं, तो डेटा दूषित हो रहा है। मैंने स्ट्रिंग रूपांतरण में समस्या को अलग करने के लिए एक मशीन पर इसका परीक्षण किया है, इसलिए अब मुझे पता है कि यह एक्सएमएल पार्सर या नेटवर्क ट्रांसपोर्ट द्वारा दूषित नहीं हो रहा है।आप बाइनरी डेटा को स्ट्रिंग्स और जावा में वापस कैसे परिवर्तित करते हैं?

क्या मैं अभी मिल गया है है

byte[] buffer = ...; // read from file 
// a few lines that prove I can process the data successfully 
String element = new String(buffer); 
byte[] newBuffer = element.getBytes(); 
// a few lines that try to process newBuffer and fail because it is not the same data anymore 

किसी को भी कैसे स्ट्रिंग के लिए द्विआधारी बदलने और डेटा हानि के बिना वापस करने के लिए पता है?

उत्तर: धन्यवाद सैम। मुझे एक बेवकूफ की तरह महसूस हो रहा है। मैंने कल जवाब दिया था क्योंकि मेरा एसएक्स पार्सर शिकायत कर रहा था। किसी कारण से जब मैं इस अलग-अलग मुद्दे में भाग गया, तो यह मेरे लिए नहीं हुआ कि यह एक ही समस्या का एक नया लक्षण था।

संपादित करें: पूर्णता के लिए, मैंने इस समस्या को हल करने के लिए Apache CommonsCodec पैकेज से Base64 कक्षा का उपयोग किया।

उत्तर

19

आप बेस 64 में यह सांकेतिक शब्दों में बदलना है, तो यह ascii सुरक्षित पाठ में किसी भी डेटा बदल जाएगी, लेकिन इनकोडिंग डेटा बेस 64 orignal डेटा

0

आप अपने XML दस्तावेज़ कैसे निर्माण कर रहे हैं से भी बड़ा है? यदि आप एक्सएमएल कक्षाओं में जावा का निर्माण करते हैं तो स्ट्रिंग एन्कोडिंग आपके लिए संभाली जानी चाहिए।

javax.xml और org.xml संकुल पर एक नज़र डालें। एक्सएमएल डॉक्स उत्पन्न करने के लिए हम यही उपयोग करते हैं, और यह सभी स्ट्रिंग एन्कोडिंग और डिकोडिंग को काफी अच्छी तरह से संभालता है।

--- संपादित करें:

हम्म, मुझे लगता है कि मैं इस समस्या को गलत समझा। आप एक नियमित स्ट्रिंग को एन्कोड करने की कोशिश नहीं कर रहे हैं, लेकिन मनमाने ढंग से बाइनरी डेटा के कुछ सेट? उस स्थिति में पहले की टिप्पणी में सुझाए गए बेस 64 एन्कोडिंग शायद जाने का तरीका है। मुझे विश्वास है कि एक्सएमएल में बाइनरी डेटा एन्कोडिंग का एक काफी मानक तरीका है।

2

, स्ट्रिंग में बाइट [] परिवर्तित तो कहीं एक्सएमएल में धकेलने के बजाय इस सवाल का, How do you embed binary data in XML? देखें Base64 एन्कोडिंग (कुछ एक्सएमएल पुस्तकालयों एक प्रकार आप के लिए यह करना है) के माध्यम से एक स्ट्रिंग के लिए बाइट [] परिवर्तित। एक बार जब आप एक्सएमएल से स्ट्रिंग वापस प्राप्त करते हैं तो BASE64 डीकोड।

उपयोग http://commons.apache.org/codec/

आप डेटा अजीब वर्ण सेट प्रतिबंध के सभी प्रकार के और गैर priting पात्रों की उपस्थिति के कारण में गड़बड़ हो रही है हो सकता है। डिक डब्ल्यू/BASE64।

35

String(byte[]) डेटा को डिफ़ॉल्ट वर्ण एन्कोडिंग के रूप में मानता है। तो, 8-बिट मानों से 16-बिट जावा यूनिकोड वर्णों में कैसे बाइट्स परिवर्तित हो जाते हैं न केवल ऑपरेटिंग सिस्टम के बीच भिन्न होंगे, बल्कि एक ही मशीन पर विभिन्न कोडपेज का उपयोग करके अलग-अलग उपयोगकर्ताओं के बीच भिन्न हो सकते हैं! यह कन्स्ट्रक्टर केवल अपनी खुद की टेक्स्ट फ़ाइलों में से एक को डीकोड करने के लिए अच्छा है। जावा में वर्णों के लिए मनमानी बाइट्स को बदलने की कोशिश न करें!

base64 के रूप में एन्कोडिंग एक अच्छा समाधान है। इस प्रकार एसएमटीपी (ई-मेल) पर फाइलें भेजी जाती हैं। (फ्री) अपाचे Commons Codec परियोजना नौकरी करेगी।

byte[] bytes = loadFile(file);   
//all chars in encoded are guaranteed to be 7-bit ASCII 
byte[] encoded = Base64.encodeBase64(bytes); 
String printMe = new String(encoded, "US-ASCII"); 
System.out.println(printMe); 
byte[] decoded = Base64.decodeBase64(encoded); 

वैकल्पिक रूप से, आप जावा 6 DatatypeConverter उपयोग कर सकते हैं:

import java.io.*; 
import java.nio.channels.*; 
import javax.xml.bind.DatatypeConverter; 

public class EncodeDecode {  
    public static void main(String[] args) throws Exception { 
    File file = new File("/bin/ls"); 
    byte[] bytes = loadFile(file, new ByteArrayOutputStream()).toByteArray(); 
    String encoded = DatatypeConverter.printBase64Binary(bytes); 
    System.out.println(encoded); 
    byte[] decoded = DatatypeConverter.parseBase64Binary(encoded); 
    // check 
    for (int i = 0; i < bytes.length; i++) { 
     assert bytes[i] == decoded[i]; 
    } 
    } 

    private static <T extends OutputStream> T loadFile(File file, T out) 
                 throws IOException { 
    FileChannel in = new FileInputStream(file).getChannel(); 
    try { 
     assert in.size() == in.transferTo(0, in.size(), Channels.newChannel(out)); 
     return out; 
    } finally { 
     in.close(); 
    } 
    } 
} 
संबंधित मुद्दे

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