意思就是编码后产生的字符串长度是6。现有的比如base64,编码后长度不能指定为6.
因此需要是自己实现的,想了很久,实在觉得蛋疼。
因此需要是自己实现的,想了很久,实在觉得蛋疼。
解决方案 »
- struts2 传值问题,希望大家帮我看看
- hashcode的问题
- 求这个hibernate 映射关系怎么写
- 关于upcasting,高手高手高高手进,谢谢!
- 请问在mysql query browser中如何建立多对多关系表?急,谢谢!
- (正则表达式)判断一个全英文字符串是否以Info结尾怎么写?
- struts在weblogic中的问题
- struts高级问题探讨!!!(怎么使一个action每天执行一次)
- Java企业级开发中常用的框架或者组件有哪些?
- 问下大佬们,java连接Hbase报 KeeperErrorCode = NoNode for /hbase/master
- 求教apache怎么和tomcat的结合的问题!重谢!
- SSH整合EXTJS,无法取到hibernatetemplet取到的数据
因此需要是自己实现的,想了很久,实在觉得蛋疼。自己实现没那么简单吧
但是能够转成长度为6的byte数组。
分析:
IP地址以"."分隔为4个单元,则每个单元为0-255范围. 使用一个字节即可表示
端口号地址为0-65535, 使用两个字节可表示.
如果使用6位编码,前4位表示IP地址,后2位表示端口号则6个byte完全可以表示出来。
故IP+端口可使用6byte表示.
示例代码如下:import java.util.StringTokenizer;
/**
* @author ZYB
* @date Feb 25, 2014 3:20:17 PM<BR/>
*/
public class CompressIpAddress { /**
* @author ZYB
* @date Feb 25, 2014 3:20:17 PM<BR/>
* @param args
*/
public static void main(String[] args) {
String[] ips = new String[]{"192.168.0.1:8080", "255.255.255.0:32", "200.38.24.129:64543"};
byte encodedIpArr[][] = new byte[ips.length][];
for(int i = 0; i < ips.length; i++){
encodedIpArr[i] = encode(ips[i]);
System.out.print(ips[i]+"/");
printByteArray(encodedIpArr[i]);
}
for(int i = 0; i < ips.length; i++){
String decoded = decode(encodedIpArr[i]);
System.out.println(ips[i]+"/" + decoded);
}
}
public static void printByteArray(byte[] array){
System.out.print(array[0]);
for(int i = 1; i < array.length; i++){
System.out.print("," + array[i]);
}
System.out.println();
}
public static byte[] encode(String ipAddress){
int portIndex = ipAddress.indexOf(":");
String portStr, ipStr;
if(portIndex >= 0){
portStr = ipAddress.substring(portIndex + 1);
ipStr = ipAddress.substring(0, portIndex);
}else{
portStr = "0";
ipStr = ipAddress;
}
byte[] result = new byte[6];
int port = Integer.parseInt(portStr);
StringTokenizer st = new StringTokenizer(ipStr, ".");
int index = 0;
while(st.hasMoreTokens()){
result[index] = (byte) (0xff & Integer.valueOf(st.nextToken()));
index++;
}
result[4] = (byte) (port>>8 & 0xff);
result[5] = (byte) (port & 0xff);
return result;
} public static String decode(byte[] encodedIp){
assert encodedIp.length == 6;
StringBuilder sb = new StringBuilder();
sb.append(encodedIp[0]&0xff).append('.')
.append(encodedIp[1]&0xff).append('.')
.append(encodedIp[2]&0xff).append('.')
.append(encodedIp[3]&0xff).append(':');
int port = (0xff & encodedIp[4])<<8 | (0xff & encodedIp[5]);
sb.append(port);
return sb.toString();
}
}