黑马程序员技术交流社区

标题: 关于字节流里复制MP3的问题 [打印本页]

作者: 途遥子若    时间: 2014-1-5 09:54
标题: 关于字节流里复制MP3的问题
  1. //一次读取一个字节,从缓冲区获取
  2. pubilc int myRead()
  3. {
  4.   //通过int对象读取应胖上的数据,并存储在buf中
  5.   if(count==0)
  6. {
  7.   count=in.read(buf);
  8.     if(count<0)
  9.         return -1;
  10.   pos=0;
  11.   byte b=buf[pos];
  12.   count--;
  13.    pos++;
  14.   return <font color="#ff0000">buf&255;</font>
  15. }
  16.   else if(count >0)
  17. {
  18.      byte b=buf[pos];
  19.      count--;
  20.      pos++;
  21.      return <font color="#ff0000">buf&0xff</font>;
  22. }
  23.    return -1;
复制代码


作者: 途遥子若    时间: 2014-1-5 09:56
我的问题是,谁可以说说上述代码部分两处buf&255位与运算的作用吗?还有这么做的原因?两处的进制怎么也不一样呢?
作者: 猎鹰tianya    时间: 2014-1-5 13:41
瞅了半天代码,愣是没看懂,表示很惭愧!!在与运算中,&255有这么一个作用,由于255用二进制表示为8个1
所以一个数&255相当于截取这个数在内存中存放的最后一个字节里存放的数据。
请看图:





作者: 途遥子若    时间: 2014-1-6 11:06
猎鹰tianya 发表于 2014-1-5 13:41
瞅了半天代码,愣是没看懂,表示很惭愧!!在与运算中,&255有这么一个作用,由于255用二进制表示为8个1
所 ...

那是毕向东老师的视频里的代码,是关于字节流复制MP3时的部分代码。那为什么两次位与运算的禁制会不同?
作者: tuanjie    时间: 2014-1-7 19:38
读取字节数组中的数据都是byte类型,而最后返回值类型却是int类型,是将byte类型数据自动转换成int类型,是为了避免读取到的一个字节类型,其八位都是1的情况,
1个byte类型的数据,其八位都是1,意味着该字节的值为-1,转换int类型后也是-1,就会因为返回值是-1而误认为文件数据已经读取完。
byte b = buf[pos]; b是byte类型,占八位,如果1个字节八位都是1,即11111111,转换成int类型,即十进制就是-1
如:byte -1    --->二进制是 11111111
        int   -1   -----> 二进制是 11111111-11111111-11111111-11111111
byte类型的 -1(11111111) 提升为int类型,结果还是-1 ,由于int类型是32位,byte的-1转换为int类型的-1时,自动在byte类型-1的8个1前面全补1,这就导致了byte类型的-1转换为int类型的,结果还是-1.为了避免读取的字节数据八位都是1,再转换为int类型时结果还是-1的情况,可以在byte类型的的八位1前面都补0,即:
byte -1    --->二进制是 11111111  转换int类型在八个1前面都补0,得到 00000000-00000000-00000000-11111111 (其十进制的值为255)。这样既可以保持原字节数据不变,而又避免了-1的情况。
让byte -1    --->二进制是 11111111 转换为int类型时,八个1前面都补0,可以通过
   11111111-11111111-11111111-11111111
& 00000000-00000000-00000000-11111111  (255)

---------------------------------------------------------------
00000000-00000000-00000000-11111111
这种方式实现,也就是代码中的 b&255;
而通过 b&255这种方式读取一个字节数据,返回一个int类型数据,即4个字节数据,那样的话,返回的数据应该是读取的数据的4倍,如果这样的话,将读取的数据写到另一个文件中时,就会出现写入的文件大小是读取文件大小的4倍,但是,事实上,读取的数据和返回的数据大小都是一样的,读取的文件大小和写入的文件大小都是一样的,那是应为read()方法读取数据时将byte类型提升为int类型,而写入数据时,write()方法也是写入字节数据,会将int类型强制转换为byte类型,即将int类型的最后八位写入到byte中,其他的都抛弃掉。
wirte()方法写入数据时:
int  类型  ------------------------------------------------------------------------------>byte
00000000-00000000-00000000-111111111  ------------------------------->11111111(只要后八位,前24位抛弃掉)
可以参考:
http://blog.csdn.net/peituanjie/article/details/17456153





欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2