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 ?

求求各位大哥,小弟初学。
感激不尽!!!

解决方案 »

  1.   

    估计传过来的应该是long类型的数据
      

  2.   

    是想把result [0]= 45; 
    result [1]= -29;         
    result [2]= 66;   
    result [3]= 74; 这个字节数组转化成“2009年6月25日”吗?
      

  3.   


    是的啊对对
    是long 传过来的可是怎么转阿??
    谢谢
      

  4.   


    大家帮帮忙吧
    跪求csdn哥哥姐姐了
      

  5.   

    四个字节只能转成int 用这个int构造的Date类是1970年的 明显不对
      

  6.   

    最好还是去问问那个写出result数组的人,他这个数组里每一个元素的意义是什么吧。
      

  7.   

    long是8个byte,你怎么只有4个byte?
      

  8.   

    /**
      * 将字节数组转换成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()));
      

  9.   


    我也头疼
    对方是拿 VC 传过来的
    我用java byte数组 接收的接收的数组里的值是
    这么多VC那边转化 可以转到 2009年6月25我这边还没摸到头绪我已经晕了
      

  10.   

    VC那边构造的是
    long 传过来的
      

  11.   

    你的VC和java是怎么通讯的?是怎么传递数据的。急了
      

  12.   

    你要检查一下你取的值是否正确,LONG应该是8位的,你这个4位的字节数组如果真是LONG型的毫秒数的话,那转换过来就不对,转换出来是1970年1月10号.
      

  13.   

    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()));
      

  14.   

    肯定是数组有问题,就不可能是4位么,我在后面加了
    result [4]= 0;  
    result [5]= 0;  
    result [6]= 0;  
    result [7]= 0;  
    转出来是
    :104782667年05月11日崩溃
      

  15.   

    有结果了:
    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日到某个时间的秒数
      

  16.   

    我明白了再这里也给大家说说
    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;大家来试试呵呵搞了半天 !!!不过谢谢大家阿
      

  17.   

     for(int i=s.length-1;i>=0;i--){
            d=(d<<8)|(s[i]&0x00000000000000ff);
            //d=d<<8+s[i];      }
    这个怎么说,还是不明白
      

  18.   

    在内存中,如果要表示一个8个字节整数,高地址放的是低字节,低地址放的是高字节.这是学汇编的时候的知识.
    但这道题中,四个字节是怎么表示一个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)这样就正负数都行得通了
      

  19.   

    23楼高,高低字节的问题,我也想到了,但还是值不对,就是没想到这个LONG居然不是毫秒,这里要考虑高低位问题后还要乘以1000.
      

  20.   

    bigbug9002老哥真厉害,我做位操作的时候按下面的方法写的
    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果然就可以了,汇编的知识没学好