如果您希望它在每种情况下都能正常工作,则需要定义 2 个特殊字符:
1-Encoding :当您连接 2 String 时:
在这两个字符串中,
- 用 2 个转义字符替换所有等于转义字符的字符
- 用escape + delimiter替换所有等于分隔符的字符
然后将两个字符串与它们之间的分隔符连接起来。
2-解码:解码字符串时:
- 如果当前字符是转义字符,而下一个字符也是转义字符,则只替换为一个转义字符并跳过 1 个字符。
- 如果当前字符是转义字符,而下一个字符也是分隔符,则只替换为一个分隔符并跳过 1 个字符。
- 如果当前字符是分隔符,那么您在 2 个原始字符串之间。
这是一个工作示例:
//I make on purpose a bad choice for escape/delimiter characters
private static final char DELIMITER = '1';
private static final char ESCAPE = '2';
public static String encode(String s1, String s2){
StringBuilder sb = new StringBuilder();
subEncode(s1, sb);
sb.append(DELIMITER);
subEncode(s2, sb);
return sb.toString();
}
private static void subEncode(String s, StringBuilder sb) {
for(char c : s.toCharArray()) {
if(c == ESCAPE) {
sb.append(ESCAPE);
sb.append(ESCAPE);
}else if(c == DELIMITER) {
sb.append(ESCAPE);
sb.append(DELIMITER);
}else {
sb.append(c);
}
}
}
public static String[] decode(String encoded) {
StringBuilder sb1 = new StringBuilder();
StringBuilder sb2 = new StringBuilder();
StringBuilder currentSb = sb1;
char[] chars = encoded.toCharArray();
for(int i = 0; i< chars.length ; i++) {
if(chars[i] == ESCAPE) {
if(chars.length < i+2) {
throw new IllegalArgumentException("Malformed encoded String");
}
if(chars[i+1] == ESCAPE) {
currentSb.append(ESCAPE);
}else if(chars[i+1] == DELIMITER) {
currentSb.append(DELIMITER);
}
i++;
}else if(chars[i] == DELIMITER) {
currentSb=sb2;
}else {
currentSb.append(chars[i]);
}
}
return new String[]{sb1.toString(), sb2.toString()};
}
测试 :
public static void main(String[] args) {
//Nominal case :
{
String s1 = "aaa";
String s2 = "bbb";
System.out.println("Encoded : " + encode(s1, s2));
System.out.println("Decoded" + Arrays.asList(decode(encode(s1,s2))));
}
//with bad characters :
{
String s1 = "111";
String s2 = "222";
System.out.println("Encoded : " + encode(s1, s2));
System.out.println("Decoded" + Arrays.asList(decode(encode(s1,s2))));
}
//with random characters :
{
String s1 = "a11a1";
String s2 = "1112bb22";
System.out.println("Encoded : " + encode(s1, s2));
System.out.println("Decoded" + Arrays.asList(decode(encode(s1,s2))));
}
}
输出 :
Encoded : aaa1bbb
Decoded[aaa, bbb]
Encoded : 2121211222222
Decoded[111, 222]
Encoded : a2121a21121212122bb2222
Decoded[a11a1, 1112bb22]
另一种方法是使用以下格式格式化编码的字符串:
size_of_str_1:str1|size_of_str2:str2
示例:如果 string1 是 'aa' 而 string2 是 'bbbb',则编码的字符串是:'2:aa|4:bbbb'。
您通过 String#subString() 对其进行解码。“硬”部分是解析字符串,直到您完成读取下一个字符串的大小。