这是Core java卷2第144页的一些代码,没看懂怎么回事,请高手指点
一下是这个代码
super.write(toBase64[(inbuf[0]&0xFC])>>2);char[] toBase64={'A','B','C','D','E'...........}
一下是这个代码
super.write(toBase64[(inbuf[0]&0xFC])>>2);char[] toBase64={'A','B','C','D','E'...........}
解决方案 »
- 求助 java怎么操作excl导入导出oracle数据库啊
- servlet怎样将数据提交到struts2中啊
- 请问谁有好用的j2ee代码生成机啊,求了老长时间,谢谢了!!!!
- 关于数据库关闭的问题,大家帮我!
- 关于jiplet-standalone(jiplet container)的菜鸟问题
- JBOSS启动问题,高手指教~!!
- java服务器和客户端 GZIP解压缩 客户端不能解压
- 如何打印HTML页面,上下没有标题,页码的那种
- jbuilder 如何直接用WEBLOGIC 部署完了的目录,是不是每次建WEB 应用都要部署一次呢?在线等!!!!
- 用jax-rpc写web service的客户端,但是wsdl中有复杂数据类型,求教!!!
- 如何注册无命名空间的jndi
- 求助:mysql数据库Parameter metadata not available for the given statement
0xfc:1111 1100
inbuf[0]&0xfc,就是除了inbuf[0]的第2到第7位(就是0xFC中那些为1的位),其它位清0.
>>2就是右移2位.(也相当于除4).
你intbuf[0]是什么类型?如果是byte类型,这句的意思就是把取绝对值的意思.你说一下intbuf是什么类型的数组.
inbuf[0]=100;
super.write(toBase64[(inbuf[0]&0xFF])>>2);
0000 0000 0000 0000 0000 0000 0110 0100
下面是inbuf[0]与0xff相与:
与运算规则是 同为1才为1,其它都为0. 0000 0000 0000 0000 0000 0000 0110 0100
& 0000 0000 0000 0000 0000 0000 1111 1111
-------------------------------------------
0000 0000 0000 0000 0000 0000 0110 0100
下面是上面的结果>>2,就是右移二位,空出来的高位要补原数的符号位(就是最高那位)结果是:
0000 0000 0000 0000 0000 0000 0001 1001这个数是1+8+16=25(实际就是100/4).
把25做为toBase64的下标,toBase64[25]是'Z',字符'Z'write出去.可能你也注意到了,100&0xff结果就是100.那inbuf[0]&0xff有什么意义呢?
这个主要是针对inbuf[0]为负数的情况.
我看了原书,应该上Base64OutputStream继承自FilterOutputStream.其write方法的参数虽然是int,但实际上写的是int中的最低的那个字节.所以intBuff[0] 写出去的就是最低的那个字节.由于是以64进制的形式写出去的,一位64进制的数对应二进制是6位。也就是每6位二进制对应一位64进制。三个字节正好是24位二进制,可以转成4位64进制字符。程序中用一个长度为3的int数组表示这三个字节的数据。转为64进制时,|11111122|22223333|33444444|,标1的二进制位为第一个64进制的位,标2的为第二个64进制位,标3的6位二进制为第三个64进制位,标4的为第4个64进制位。11111122这个字节放在inbuf[0]中,22223333这个字节放在inbuf[1]中,33444444这个字节放在inbuf[2]中。所以写第一个64进制位字符时,要取出第一个字节(inbuf[0])的高6位,转为对应的64进制字符,写出去。写第二个64进制字符时,要把第一个字节(inbuf[0])的低2位与第二个字节(inbuf[1])的高4位合在一起转为一个64进制字符,写出去。写第三个64进制位字符时,要把第二个字节(inbuf[1])的低四位与第三个字节(inbuf[2])的高2位合在一起,转为64进制位字符,写出去。第四个64进制字符时,要把第三个字节的低6位转为64进制字符,写出去。把一个字节的某几位取出来就要用&运算,把两部分二进制合在一起要用|或运算。