思路分析
例如二进制:0010 1011,存放在字符串数组String[] str2={"0010","1011"}中
设String[] str= {"000","001","010","011","100","101","110","111"};
首先将str2中每个字符串拆分成单个字符存放到字符数组char[] c=new char[str2.length*4]中
声明字符数组char[] str8,但str8的长度不确定,需要根据以下两者情况进行分类:
情况一:
若c.length%3!=0,即字符数组C中,进行三个字符一组,无法整分,有多余的字符,这种情况下,设str8=new char[c.length/3+1]
例如:00101011
情况二:
若c.length%3==0,即字符数组C中,进行三个字符一组,可以整分,这种情况下,设str8=new char[c.length/3]
例如:001010110011
接下来就根据c中的字符进行三个一组进行分组:
对于c.length%3!=0的情况,又可分成以下两种情况:
若c.length%3==2,例如:00101011,则s="0"+c[0]+c[1];,即前两个元素加上"0"为一组,剩下的元素每三个字符为一组,即 分成000、101、011,字符串"000"在str中的索引下标为0,则二进制000对应的八进制为0,同理字符串"101"在str中的索引下标为5,则二进制101对应的八进制为5。
若c.length%3==1,例如:0010101100100010,则s="00"+c[0];,即前一个元素加上"00"为一组,剩下的元素每三个字符为一组,然后再进行同上的操作。
对于c.length%3==0的情况,以三个字符为一组,可以整分
代码
private static char[] Convert2To8(String[] str2) {
char[] c=new char[str2.length*4];
int j=0;
for(int i=0;i<str2.length;i++) {
c[j++]=str2[i].charAt(0);
c[j++]=str2[i].charAt(1);
c[j++]=str2[i].charAt(2);
c[j++]=str2[i].charAt(3);
}
String s;
char[] str8;
int k=0;
if(c.length%3!=0) {
str8=new char[c.length/3+1];
if((3-(c.length%3))==1) {
s="0"+c[0]+c[1];
str8[k++]=isWho8(s);
for(int i=2;i<c.length-2;i=i+3) {
s=""+c[i]+c[i+1]+c[i+2];
str8[k++]=isWho8(s);
}
}else if(3-(c.length%3)==2) {
s="00"+c[0];
str8[k++]=isWho8(s);
for(int i=1;i<c.length-2;i=i+3) {
s=""+c[i]+c[i+1]+c[i+2];
str8[k++]=isWho8(s);
}
}
}else {
str8=new char[c.length/3];
for(int i=0;i<c.length-2;i=i+3) {
s=""+c[i]+c[i+1]+c[i+2];
str8[k++]=isWho8(s);
}
}
return str8;
}
private static char isWho8(String s) {
char c='0';
String[] str= {"000","001","010","011","100","101","110","111"};
for(int i=0;i<str.length;i++) {
if(s.equals(str[i])) {
c=(char) (i+'0');
break;
}
}
return c;
}