首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > JAVA > Java相关 >

byte[] 转int String 的原理。解决办法

2013-07-01 
byte[] 转intString的原理。public int byteConvertInt(byte[] bytes) {int s 0int s0 bytes[0] & 0xf

byte[] 转int String 的原理。

public int byteConvertInt(byte[] bytes) {
int s = 0;
int s0 = bytes[0] & 0xff;// 最低位
int s1 = bytes[1] & 0xff;
int s2 = bytes[2] & 0xff;
int s3 = bytes[3] & 0xff;
 
s1 <<= 8;
s2 <<= 16;
s3 <<= 24;
 
s = s0 | s1 | s2 | s3; 
return s;
}



/**
* 将4字节的byte数组转成一个int值
* @param b
* @return
*/
public static int byteArray2int(byte[] b){
    byte[] a = new byte[4];
    int i = a.length - 1,j = b.length - 1;
    for (; i >= 0 ; i--,j--) {//从b的尾部(即int值的低位)开始copy数据
        if(j >= 0)
            a[i] = b[j];
        else
            a[i] = 0;//如果b.length不足4,则将高位补0
  }
    int v0 = (a[0] & 0xff) << 24;//&0xff将byte值无差异转成int,避免Java自动类型提升后,会保留高位的符号位
    int v1 = (a[1] & 0xff) << 16;
    int v2 = (a[2] & 0xff) << 8;
    int v3 = (a[3] & 0xff) ;
    return v0 + v1 + v2 + v3;
}


 这是网上搜的两个代码,  我想知道原理

 下面这个代码是 int -> byte[]
/**
*将32位的int值放到4字节的byte[]里
* @param num
* @return
*/
public static byte[] int2byteArray(int num) {
   byte[] result = new byte[4];
   result[0] = (byte)(num >>> 24);//取最高8位放到0下标
   result[1] = (byte)(num >>> 16);//取次高8为放到1下标
   result[2] = (byte)(num >>> 8); //取次低8位放到2下标
   result[3] = (byte)(num );      //取最低8位放到3下标
   return result;
}



1、3两个代码,一个说[0]最低位,一个说[0] 是最高位。
 我不懂原理,求助!!
 注释也行,
 1代码中先&转换,随后移位,最后是|得出结果,为什么这样?
 2代码中相加 Java bytearray String
[解决办法]
至于3中0是最高位问题 int强制转byte是截取最低的8位 所以想得到最高位就要把数据整个左移24位 把最高的8位移到最低的8位上才行 知道这个其实你想0是最高位只不是是按个人爱好来的 你完全可以倒过来写 把0变成最低位
[解决办法]
整形转化为byte字符串一般有两种方式,一种是高位字节在前,两外一种是低位字节在前。
所以具体是什么顺序要看约定。


java整形内存表示形式是big endian的形式,也就是高字节在内存底地址,一般输出为二进制的时候也是这个格式。

[解决办法]
还是打个比喻吧 int是32位 把它分成4组 用二进制表示就是10000000 01000000 00100000 00010000
当你int转成byte类型的时候是取最后的8位 也就是00010000 
所以你要得到int转char 那么就要把这4个8位的二进制分别存到一个byte中 但是byte只能获得最后8位 那怎么办呢 
这个时候你把int右移24位 你就会发现原来的10000000 会到最低的8位上去 再转成char 不就得到了最高的8位了么 知道怎么转了 怎么存还不简单么 你可以一开始把00010000存进byte[0] 00100000右移8位存到byte[1] 01000000右移8位存到byte[2]  10000000右移8位存到byte[3] 但是这样存的话 你要想再得到int的话 byte数组要倒过来遍历输出 因为这样存是低位往高位存的 所以一般都是byte[0]存最高8位 这样可以直接用1 输出了
至于&这个符号就相当于一个且操作

热点排行