static byte result[] = new byte[4]; result [0]= 45;
result [1]= -29;
result [2]= 66;
result [3]= 74; 怎么把 result 转化成 正确的时间
对方传过来的值 就是 result
正确的时间是: 2009年6月25日怎么转阿,将byte【】转成能看得懂的 int 或者 string ?
求求各位大哥,小弟初学。
感激不尽!!!
result [1]= -29;
result [2]= 66;
result [3]= 74; 怎么把 result 转化成 正确的时间
对方传过来的值 就是 result
正确的时间是: 2009年6月25日怎么转阿,将byte【】转成能看得懂的 int 或者 string ?
求求各位大哥,小弟初学。
感激不尽!!!
result [1]= -29;
result [2]= 66;
result [3]= 74; 这个字节数组转化成“2009年6月25日”吗?
是的啊对对
是long 传过来的可是怎么转阿??
谢谢
大家帮帮忙吧
跪求csdn哥哥姐姐了
* 将字节数组转换成long
* @param b byte[]
* @return long
*/
public static long bytesToLong(byte[] b,int index,int len){
byte[] bytes = new byte[len];
System.arraycopy(b,index,bytes,0,len);
BigInteger bi = new BigInteger(bytes);
long lon = bi.longValue();
return lon;
}
/**
* 将byte数组的数据,转换成Int值.
* @param byteVal byte数组
* @return Int值.
*/
public static int bytes2Int(byte[] b,int index,int len) {
byte[] byteVal = new byte[len];
System.arraycopy(b,index,byteVal,0,len);
int result = 0;
for(int i = 0; i < len; i ++) {
int tmpVal = (byteVal[i] << (8 * (3-i)));
switch (i) {
case 0:
tmpVal = tmpVal & 0xFF000000;
break;
case 1:
tmpVal = tmpVal & 0x00FF0000;
break;
case 2:
tmpVal = tmpVal & 0x0000FF00;
break;
case 3:
tmpVal = tmpVal & 0x000000FF;
break;
}
result = result | tmpVal;
}
return result;
}BYTE转LONG及INT,用这两个方法试,至于毫秒数转时间以及时间格式化,代码如下 java.util.Calendar c = java.util.Calendar.getInstance();
c.setTimeInMillis(XXX.bytesToLong(result, 0, 4));
java.text.SimpleDateFormat ssd = new java.text.SimpleDateFormat("yyyy年MM月dd日");
System.out.println(ssd.format(c.getTime()));
我也头疼
对方是拿 VC 传过来的
我用java byte数组 接收的接收的数组里的值是
这么多VC那边转化 可以转到 2009年6月25我这边还没摸到头绪我已经晕了
long 传过来的
c.setTimeInMillis(XXX.bytesToLong(result, 0, 4));
java.text.SimpleDateFormat ssd = new java.text.SimpleDateFormat("yyyy年MM月dd日");
System.out.println(ssd.format(c.getTime()));
result [4]= 0;
result [5]= 0;
result [6]= 0;
result [7]= 0;
转出来是
:104782667年05月11日崩溃
import java.text.*;
import java.util.*;
public class Test{
public static void main(String[] args){
byte[] s={45,-29,66,74};
long d=0;
for(int i=s.length-1;i>=0;i--){
d=(d<<8)|(s[i]&0x00000000000000ff);
//d=d<<8+s[i]; }
d=d*1000;
System.out.println(d);
Date da=new Date(d);
SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd");
System.out.println(sdf.format(da)); }
}输出是2009-06-25.
c++中long是4byte,一般是从1970年1月1日到某个时间的秒数
vc是秒计算
java是毫秒计算所以
要乘以1000java.util.Calendar c = java.util.Calendar.getInstance();
c.setTimeInMillis(bytesToLong(result,0,4)*1000);
java.text.SimpleDateFormat ssd = new java.text.SimpleDateFormat("yyyy年MM月dd日");
System.out.println(ssd.format(c.getTime()));
result [0]= 45;
result [1]= -29;
result [2]= 66;
result [3]= 74;
result 这个顺序再反过来就对了换成 result [0]= 74;
result [1]= 66;
result [2]= -29;
result [3]= 45;大家来试试呵呵搞了半天 !!!不过谢谢大家阿
d=(d<<8)|(s[i]&0x00000000000000ff);
//d=d<<8+s[i]; }
这个怎么说,还是不明白
但这道题中,四个字节是怎么表示一个c++中的long的我吃不准,只能正着试一次,反着试一次.结果反着来可以.
如果四个字节都是正数,d=d<<8+s[i]是可以的.
但如果有负数就不行了,-29是从原来long中分出来的,应该看成一个无符号数.d=(d<<8)|s[i]这样也不行的.s[i]会转成long,负数符号位要扩展.所以应该把高56位的都用0清掉.d=(d < <8)|(s[i]&0x00000000000000ff)这样就正负数都行得通了
lont l=0;l=l<<8;
l=l|(result[3]);
l=l<<8;
l=l|(result[2]);l=l<<8;
l=l|(result[1]);l=l<<8;
l=l|(result[0]);
结果总是不对,看了你的代码才恍然想起来负数时有符号位的
用一个常数做掩膜0xff果然就可以了,汇编的知识没学好