byte[] 转int String 的原理。

zgf1991 2013-06-06 03:49:36
	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代码中相加
...全文
361 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
zgf1991 2013-06-08
  • 打赏
  • 举报
回复
引用 7 楼 xiuxiu2by 的回复:
不好意思 上面的 00010000存进byte[0] 00100000右移8位存到byte[1] 01000000右移8位存到byte[2] 10000000右移8位存到byte[3] 写错了 应该是 00010000存进byte[0] 00100000右移8位存到byte[1] 01000000右移16位存到byte[2] 10000000右移24位存到byte[3]
那这么说, 我发的代码中 1 就不合适了 ,是吗?他是byte[3]左移24,byte[3]是最高位?
zgf1991 2013-06-08
  • 打赏
  • 举报
回复
引用 5 楼 fei1710 的回复:
整形转化为byte字符串一般有两种方式,一种是高位字节在前,两外一种是低位字节在前。 所以具体是什么顺序要看约定。 java整形内存表示形式是big endian的形式,也就是高字节在内存底地址,一般输出为二进制的时候也是这个格式。
那这么说, 我发的代码中 1 就不合适了 ,是吗?他是byte[3]左移24,byte[3]是最高位?
zgf1991 2013-06-08
  • 打赏
  • 举报
回复
引用 6 楼 xiuxiu2by 的回复:
还是打个比喻吧 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 输出了 至于&这个符号就相当于一个且操作
谢谢, 我就明白一点int强制byte的时候 取的是最后的8位(是最低位吧) (右移24 16 8 其实也就相当于是说 10000000 01000000 00100000 00010000 我要前面0 1 2 位置的值,而转byte又只会取最后(3)位置的值?) ,是这么理解吗 将一个int转byte, 4个byte,第一个[0]是,第一个,所以得右移24,依次类推[1]16 [2]8 [3]0 那byte[]转int 应该从byte[]最后一位取值,因为byte[]可能length<4? 没有就高位补0. 那么也就可以这么理解,一般的byte[]转int,(byte[] length == 4)byte[0]高位...byte[3]低位 5楼好像说了 整形转化为byte字符串一般有两种方式,一种是高位字节在前,两外一种是低位字节在前。 那byte转int也有两种方式吧? 就看约定? java中 是高位在前? 我昨晚看的c++ 1是 00000000 00000000 00000000 00000001 最高位是0代表正? 那就是C++里面和java相反 是吗
抱抱枯叶 2013-06-08
  • 打赏
  • 举报
回复
整形转化为byte字符串一般有两种方式,一种是高位字节在前,两外一种是低位字节在前。 这个我还是真不是很清楚 我也是学java不是很久的 我自己写测试例子的时候 int强制类型转换byte的时候都是取的低8位 当int二进制码最高位是1的时候 代表这个数是负数 0代表整数 这个和c++里应该是一样的吧
抱抱枯叶 2013-06-07
  • 打赏
  • 举报
回复
所有的右移都是相对一int类型的右移
抱抱枯叶 2013-06-07
  • 打赏
  • 举报
回复
不好意思 上面的 00010000存进byte[0] 00100000右移8位存到byte[1] 01000000右移8位存到byte[2] 10000000右移8位存到byte[3] 写错了 应该是 00010000存进byte[0] 00100000右移8位存到byte[1] 01000000右移16位存到byte[2] 10000000右移24位存到byte[3]
抱抱枯叶 2013-06-07
  • 打赏
  • 举报
回复
还是打个比喻吧 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 输出了 至于&这个符号就相当于一个且操作
fei1710 2013-06-07
  • 打赏
  • 举报
回复
整形转化为byte字符串一般有两种方式,一种是高位字节在前,两外一种是低位字节在前。 所以具体是什么顺序要看约定。 java整形内存表示形式是big endian的形式,也就是高字节在内存底地址,一般输出为二进制的时候也是这个格式。
zgf1991 2013-06-07
  • 打赏
  • 举报
回复
引用 2 楼 xiuxiu2by 的回复:
至于3中0是最高位问题 int强制转byte是截取最低的8位 所以想得到最高位就要把数据整个左移24位 把最高的8位移到最低的8位上才行 知道这个其实你想0是最高位只不是是按个人爱好来的 你完全可以倒过来写 把0变成最低位
还是晕的 - - , 以后若是有byte[], 就认真[0]是最高位 << 24 [3]是最低位 不动吗? 把我给绕晕了, &0xff,明白点, 至于为什么要[0]或是[3] 移24,不懂 也不明白为什么要怎么弄
抱抱枯叶 2013-06-06
  • 打赏
  • 举报
回复
其实加和|的操作是相似的 这边可以互换 想用哪个就哪个
抱抱枯叶 2013-06-06
  • 打赏
  • 举报
回复
至于3中0是最高位问题 int强制转byte是截取最低的8位 所以想得到最高位就要把数据整个左移24位 把最高的8位移到最低的8位上才行 知道这个其实你想0是最高位只不是是按个人爱好来的 你完全可以倒过来写 把0变成最低位
抱抱枯叶 2013-06-06
  • 打赏
  • 举报
回复
1中都是位操作 首先int是32位 byte6位 一个int 4个byte组成 bytes[0]低八位 bytes[4]最高的8位 然后bytes[0]&0xff 就可以得出bytes[0]的二进制码 同里得到4组8位的二进制码 然后bytes[0]是第八位不动 bytes[1]要是8到16位 所以要左移8位 其他同理 组后通过|操作 把4组8位组成32位的二进制

50,547

社区成员

发帖
与我相关
我的任务
社区描述
Java相关技术讨论
javaspring bootspring cloud 技术论坛(原bbs)
社区管理员
  • Java相关社区
  • 小虚竹
  • 谙忆
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧