最好是逐行翻译,说明下方法的作用private static final char[] DIGITS = { '0', '1', '2', '3', '4', '5', '6',
'7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f' }; protected static char[] encodeHex(byte[] data)
{ int l = data.length; char[] out = new char[l << 1]; // two characters form the hex value.
for (int i = 0, j = 0; i < l; i++)
{
out[j++] = DIGITS[(0xF0 & data[i]) >>> 4];
out[j++] = DIGITS[0x0F & data[i]];
} return out;
} protected static byte[] decodeHex(char[] data) throws Exception
{ int len = data.length; if ((len & 0x01) != 0)
{
throw new Exception("Odd number of characters.");
} byte[] out = new byte[len >> 1]; // two characters form the hex value.
for (int i = 0, j = 0; j < len; i++)
{
int f = toDigit(data[j], j) << 4;
j++;
f = f | toDigit(data[j], j);
j++;
out[i] = (byte) (f & 0xFF);
} return out;
}
'7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f' }; protected static char[] encodeHex(byte[] data)
{ int l = data.length; char[] out = new char[l << 1]; // two characters form the hex value.
for (int i = 0, j = 0; i < l; i++)
{
out[j++] = DIGITS[(0xF0 & data[i]) >>> 4];
out[j++] = DIGITS[0x0F & data[i]];
} return out;
} protected static byte[] decodeHex(char[] data) throws Exception
{ int len = data.length; if ((len & 0x01) != 0)
{
throw new Exception("Odd number of characters.");
} byte[] out = new byte[len >> 1]; // two characters form the hex value.
for (int i = 0, j = 0; j < len; i++)
{
int f = toDigit(data[j], j) << 4;
j++;
f = f | toDigit(data[j], j);
j++;
out[i] = (byte) (f & 0xFF);
} return out;
}
解决方案 »
- 编码问题,就Help?
- 各种Subversion客户端工具列表
- 一个关于OpenSessionInViewFilter的问题
- 高分求助,一个非常奇怪的问题:Compiler thread crashed while compiling a method!
- 为什么用Jboss部署WebService总是http://localhost/,能不能改成其它域名?
- 关于 serlvet jsp 标准问题
- 大家推荐一本学习J2EE的好书吧,谢谢了!!
- 有没有在中国平安在搞开发的
- csdn中没有高手。。。。。
- 请教一下关于建立spring的bean的问题
- 循环问题
- 很窝火,UML的东西应该谁来写?普通开发人员吗?
out[j++] = DIGITS[0x0F & data[i]];//0x0F是得到第4位的掩碼。然后換算為DIGITS中的16進制中的值。
if ((len & 0x01) != 0)//判斷len是否為0,就拋異常。
byte[] out = new byte[len >> 1];//同理,創建一個byte數組,大小是len的兩倍。
int f = toDigit(data[j], j) << 4;//toDigit方法沒找到...
byte[] out = new byte[len >> 1];//同理,創建一個byte數組,大小是len的一半。
'7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f' }; //定义一个字符数组,16个字符是对应的16进制的0~15,下标和值是对应的。 protected static char[] encodeHex(byte[] data)
{ int l = data.length; //取参数data的长度 char[] out = new char[l << 1]; //结果数组,l<<1,左移,相当于乘2,也就是说,out的长度是data的一倍。 // two characters form the hex value.
for (int i = 0, j = 0; i < l; i++)
{
//把0xf0&data[i]是把data[i]的低四位清零,>>>4是不带符号位的右移4位。
//整个的操作就是把data[i]的高四位取出,做为下标,从DIGITS中找到对应的16进制字符,赋值给out[j]
out[j++] = DIGITS[(0xF0 & data[i]) >>> 4];
out[j++] = DIGITS[0x0F & data[i]]; //同上,取出低四位,并转为16进制。
} return out;
} protected static byte[] decodeHex(char[] data) throws Exception
{ int len = data.length; if ((len & 0x01) != 0) //len&0x01!=0,说明len的最低位是1,同时说明len是一个奇数。
{
throw new Exception("Odd number of characters.");
} byte[] out = new byte[len >> 1]; //len>>1相当于len除2, 结果是参数数组的一半。 // two characters form the hex value.
for (int i = 0, j = 0; j < len; i++)
{
//toDigit方法没有找到,估计是把16进制的字符转为对应的16进制。
//<<4是左移4位结果给f,低四位空出来,准备放下一数据。
int f = toDigit(data[j], j) << 4;
j++;
f = f | toDigit(data[j], j); //低四位放入f。
j++;
out[i] = (byte) (f & 0xFF); //f&0xff是把f的前三个字节清0,目的的去掉符号位的影响.把原来放进f的两个16进制对应的数看成无符号数。
} return out;
}
一部分:protected static char[] encodeHex(byte[] data)
{ int l = data.length; //取参数data的长度 char[] out = new char[l << 1]; //结果数组,l<<1,左移,相当于乘2,也就是说,out的长度是data的一倍。 // two characters form the hex value.
for (int i = 0, j = 0; i < l; i++)
{
//把0xf0&data[i]是把data[i]的低四位清零,>>>4是不带符号位的右移4位。
//整个的操作就是把data[i]的高四位取出,做为下标,从DIGITS中找到对应的16进制字符,赋值给out[j]
out[j++] = DIGITS[(0xF0 & data[i]) >>> 4];
out[j++] = DIGITS[0x0F & data[i]]; //同上,取出低四位,并转为16进制。
} return out;
}
为什么char[] out = new char[l << 1];要扩大一倍类?
还有就是为什么0xF0 & data[i]这个下标可以得到对应的16进制的字符?
基本没有用吧.java 的Integer类和Long类有toHexString()方法,可以把一个数值转为16进制的字符串.byte数可以变通一下使用.各个包装类都提供valueOf(String s, int radix) 把s按radix进制解析为整数.