मैं एक क्रमबद्धता समस्या के रूप में इस का इलाज और सिर्फ होगा
import java.nio.ByteBuffer;
import java.util.ArrayList;
public class Serialization {
public static byte[] serialize(String[] strs) {
ArrayList<Byte> byteList = new ArrayList<Byte>();
for (String str: strs) {
int len = str.getBytes().length;
ByteBuffer bb = ByteBuffer.allocate(4);
bb.putInt(len);
byte[] lenArray = bb.array();
for (byte b: lenArray) {
byteList.add(b);
}
byte[] strArray = str.getBytes();
for (byte b: strArray) {
byteList.add(b);
}
}
byte[] result = new byte[byteList.size()];
for (int i=0; i<byteList.size(); i++) {
result[i] = byteList.get(i);
}
return result;
}
public static String[] unserialize(byte[] bytes) {
ArrayList<String> strList = new ArrayList<String>();
for (int i=0; i< bytes.length;) {
byte[] lenArray = new byte[4];
for (int j=i; j<i+4; j++) {
lenArray[j-i] = bytes[j];
}
ByteBuffer wrapped = ByteBuffer.wrap(lenArray);
int len = wrapped.getInt();
byte[] strArray = new byte[len];
for (int k=i+4; k<i+4+len; k++) {
strArray[k-i-4] = bytes[k];
}
strList.add(new String(strArray));
i += 4+len;
}
return strList.toArray(new String[strList.size()]);
}
public static void main(String[] args) {
String[] input = {"This is","a serialization problem;","string concatenation will do as well","in some cases."};
byte[] byteArray = serialize(input);
String[] output = unserialize(byteArray);
for (String str: output) {
System.out.println(str);
}
}
}
विचार यह है कि जिसके परिणामस्वरूप बाइट सरणी में हम (पहली स्ट्रिंग की लंबाई जो हमेशा 4 बाइट है अगर हम प्रयोग की दुकान है: यह के रूप में (पूर्ण और काम कर रहे जावा कोड) इस प्रकार से लागू किया int
टाइप करें), उसके बाद पहली स्ट्रिंग के बाइट्स (जिनकी लंबाई पिछले 4 बाइट्स से बाद में पढ़ी जा सकती है), उसके बाद दूसरी स्ट्रिंग की लंबाई और दूसरी स्ट्रिंग के बाइट्स के बाद, और इसी तरह। इस प्रकार, स्ट्रिंग सरणी को परिणामी बाइट सरणी से आसानी से पुनर्प्राप्त किया जा सकता है, जैसा ऊपर दिए गए कोड द्वारा प्रदर्शित किया गया है। और यह क्रमिकरण दृष्टिकोण किसी भी स्थिति को संभाल सकता है।
और यदि हम इनपुट स्ट्रिंग सरणी के लिए एक धारणा बनाने के कोड बहुत सरल हो सकता है:
public class Concatenation {
public static byte[] concatenate(String[] strs) {
StringBuilder sb = new StringBuilder();
for (int i=0; i<strs.length; i++) {
sb.append(strs[i]);
if (i != strs.length-1) {
sb.append("*.*"); //concatenate by this splitter
}
}
return sb.toString().getBytes();
}
public static String[] split(byte[] bytes) {
String entire = new String(bytes);
return entire.split("\\*\\.\\*");
}
public static void main(String[] args) {
String[] input = {"This is","a serialization problem;","string concatenation will do as well","in some cases."};
byte[] byteArray = concatenate(input);
String[] output = split(byteArray);
for (String str: output) {
System.out.println(str);
}
}
}
धारणा है कि *.*
इनपुट सरणी से कोई भी स्ट्रिंग में मौजूद नहीं है है। दूसरे शब्दों में, यदि आप पहले से जानते हैं तो इनपुट सरणी के किसी भी स्ट्रिंग में प्रतीकों का कुछ विशेष अनुक्रम दिखाई नहीं देगा, तो आप उस अनुक्रम को स्प्लिटर के रूप में उपयोग कर सकते हैं।
स्रोत
2013-02-03 06:33:57
आप प्रत्येक स्ट्रिंग के लिए पुनरावृत्त कर सकते हैं और अंतिम बाइट सरणी में शामिल रह सकते हैं। उदाहरण उदाहरण = "यह एक उदाहरण है"; // स्ट्रिंग को बाइट [] का उपयोग करके .getBytes() फ़ंक्शन बाइट [] बाइट्स = example.getBytes(); // नई स्ट्रिंग (बाइट []) स्ट्रिंग एस = नई स्ट्रिंग (बाइट्स) का उपयोग करके बाइट [] स्ट्रिंग में स्ट्रिंग कनवर्ट करें; –
क्या आपने यह प्रश्न देखा है? http://stackoverflow.com/questions/1536054/how-to-convert-byte-array-to-string-and-vice-versa –
अली बी - मुझे लगता है कि आपके द्वारा लिंक किया गया प्रश्न थोड़ा अलग प्रश्न का उत्तर देता है - खासकर जब आप स्वीकार्य उत्तर देखें, जो सही मायने में बताता है कि "यदि आप वास्तव में स्ट्रिंग प्रकार में बाइनरी डेटा स्टोर करना चाहते हैं, तो आपको बेस 64 एन्कोडिंग का उपयोग करना चाहिए। – Floris