比如:
byte[] bs=new byte[6];要前面4字节填充一个int,后面两个字节填一个short.

解决方案 »

  1.   

    不就是移位计算吗? 懒得写了, 参考http://www.code365.com/programe/java/news/200512171731371526.htm
      

  2.   

    import java.io.IOException;
    import java.util.Arrays;public class Test { public static void main(String[] args) {
    byte[] bs = new byte[] { 1, 2, 3, 4, 5, 6 };
    System.out.println(bytes2int(bs, 0));
    System.out.println(bytes2short(bs, 4));
    System.out.println(Arrays.toString(int2bytes(16909060)));
    System.out.println(Arrays.toString(short2bytes((short) 1286))); } static int bytes2int(byte[] b, int startIndex) {
    int re = 0;
    for (int i = startIndex; i < startIndex + 4; i++) {
    re <<= 8;
    re += b[i];
    }
    return re;
    } static short bytes2short(byte[] b, int startIndex) {
    short re = 0;
    for (int i = startIndex; i < startIndex + 2; i++) {
    re <<= 8;
    re += b[i];
    }
    return re;
    } static byte[] int2bytes(int x) {
    byte[] b = new byte[4];
    for (int i = b.length; i > 0; i--) {
    b[i - 1] = (byte) x;
    x >>= 8;
    }
    return b;
    } static byte[] short2bytes(short x) {
    byte[] b = new byte[2];
    for (int i = b.length; i > 0; i--) {
    b[i - 1] = (byte) x;
    x >>= 8;
    }
    return b;
    }}
      

  3.   

    移位好像不能解决问题啊!假如有一个100字节的数组,我要把前面4个字节填一个int,从第五个字节开始填入不定长度的字符串,字符串填完之后再紧接着填入一个int.VC中用memcpy,C#也有相应的类可以解决,搞不清楚java中用什么!主要是网络通讯中,协议自定义的,要用到这些东西。附一段C#代码:byteHead是一个字节数组,是发送包的信息头。msgID=System.BitConverter.ToInt32(byteHead,2); //把节字数组的第三个字节转成int,
    staID=byteHead[6];
    pdaID=byteHead[7];
    contLen=System.BitConverter.ToInt16(byteHead,8);
    ascSum=System.BitConverter.ToInt16(byteHead,10);
      

  4.   

    谢谢 dreamover(梦醒了) ( ) 信誉:100代码看懂了,太麻烦了!相比之下,VC的代最简单:byte bs[8];
    int i=10;
    int j=30;
    memcpy(bs,&i,4);
    memcpy(&bs[4],&j,4);
      

  5.   

    java里面没有指针,而且类型检查也比较严格。优点就是不容易出错,缺点就是不够灵活。很多东西都是得失兼备的。
      

  6.   

    对应于 C 中 的 memcpy,Java 有 System.arraycopy()。问题的关键可能在于“第五个字节开始填入不定长度的字符串”。无论如何,网络传输的数据流必须有一个“规则”来规定如何对这个数据流进行解析,用什么编程语言并不重要。比如你这个“不定长的字符串”,可以考虑用 zero-terminated 规则,也可以考虑在字符串前面放两个字节来表示“字符串长度”。对于后一种方法,请参考 DataInputStream.readUTF() 和 DataOutputStream.writeUTF()
      

  7.   

    > 相比之下,VC的代最简单:
    > memcpy(bs,&i,4);这种简单是有代价的,它要求“网络传输的数据流”跟“本机的数据内部表示法”是一致的,比如,对于一个“整数”,就存在“数据宽度”和“字节顺序”的问题。Java 中没有这么“简单”的操作,就是为了避免这种“危险的代价”。你自己根据“协议”要求实现一套转换算法,就像 dreamover(梦醒了) 那样,既安全可靠,又简单方便(毕竟一劳永逸的事情嘛)