注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

倚天剑

青春要在奔跑中度过

 
 
 

日志

 
 
 
 

为什么InputStream.read()读取一个byte确返回一个int呢?  

2013-08-14 22:35:20|  分类: 开发 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

转自:http://openmind.iteye.com/blog/1866096


问题1:为什么InputStream.read()读取一个byte却返回一个int呢?

InputStream.read()返回一个unsigned byte [0 - 255],而java里面没有这个类型,所以用int接收。

byte的范围是[-128,127],所以如果read()返回的数在[128,255]的范围内时,则表示负数,即

 

(byte)128=-128

 

(byte)129=-127

 

(byte)255=-1

 

所以如果read()返回的是byte的话,那就会有负数。而"返回-1意味着结束",这个信息量用byte是无法表达的,所以必须用int。

 

问题2:如何把一个整数(int)正确保存到一个byte数组,并从里面正确的读出来?

先看代码再解释:

Java代码  收藏代码
  1. public static int readInt(byte[] readBuffer, int offset) {  
  2.     int i = offset;  
  3.     //readBuffer[i]范围是[-128,127],转整形时必须是[0,255]  
  4.     int ch1 = readBuffer[i++] & 255;  
  5.     int ch2 = readBuffer[i++] & 255;  
  6.     int ch3 = readBuffer[i++] & 255;  
  7.     int ch4 = readBuffer[i++] & 255;  
  8.     return ((ch1 << 24) + (ch2 << 16) + (ch3 << 8) + (ch4 << 0));  
  9. }  
  10.   
  11. public static void writeInt(int v, byte[] writeBuffer, int offset) {  
  12.     int i = offset;  
  13.     //这里面会存在负数  
  14.     writeBuffer[i++] = (byte) (v >>> 24);  
  15.     writeBuffer[i++] = (byte) (v >>> 16);  
  16.     writeBuffer[i++] = (byte) (v >>> 8);  
  17.     writeBuffer[i++] = (byte) (v >>> 0);  
  18. }  

 

 

对于writeInt:v无符号右移>>>肯定是正数,即[0,255],用byte强转型后就可能负数[-128,127]。

 

对于readInt:readBuffer[i++]是有负数的,必须转成无符号整形,即&255变成[0,255]范围之后才可以用于组装int。 

 

延伸3:

 OutputStream.write(int b):相当与write(b&255),

如果你write(-2),因为-2&255=254,那么相应的r = InputStream.read()返回的是254,需要(int) (byte) r才能获取你想要的值((byte)254=-2)

 

结论:可以认为OutputStream和InputStream里面都是unsigned byte。

 

  评论这张
 
阅读(607)| 评论(0)
推荐 转载

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017