struct {
  char a[3];
  int i;
  char b[5];
  char c[2];
};如果是按四字节对齐的话,那么上面这个结构体就是20字节大小了。在java中如果要和C使用对齐方式来传递这个结构,JAVA中应该如何补齐?难道定义一个:class {
 byte[] a = new byte[4];
 int i;
 byte[] b = new byte[8];
 byte[] c = new byte[4];
}只能这样手工来补齐吗? 

解决方案 »

  1.   

    1. C和Java处理内存中二进制数据的方式不一样,所以即使你传递过去了,也未必有用,即使是同一段数据,他们未必会认识对方的。
    2. C中结构体的字节对齐与编译器有关。
    3. 没注意过Java中是否有字节对齐,应该有吧,毕竟为了访问速度,如果没有,还真只有自己处理了。
    4. 为了实现C与Java的通讯,还是自己定义一个通讯格式,C收到Java的数据后,再解析成自己的结构体。
      

  2.   

    当然我要发送一个结构体的话肯定是将各个字段拼成一个byte[]来发送啊。所以如何对齐还是要手工来处理吧?跟JVM有啥关系?
      

  3.   

    网络通信用的?用DataOutputStream怎么样?
      

  4.   


    Java通常是通过序列化serialize来将对象转换为字节数组,不是手工处理的
      

  5.   

    如果是跨语言通讯,就只有双方都遵守某个协议了。
    java不存在对不对齐的问题,java连sizeof都没有,所以这些是JVM操心的事情,应用程序员不需要关心。
      

  6.   

    JAVA的序列化可以自定义实现么?好像implements Serializable是不能改写private void writeObject(java.io.ObjectOutputStream out)
         throws IOException
     private void readObject(java.io.ObjectInputStream in)
         throws IOException, ClassNotFoundException;这两个方法的。所以这种形为只是在传输对象时有用,而且对方必需是用同样方法反序列化得到这个对象。但我现在是java与c等进行socket通讯。如何指定字段的值传送呢?
      

  7.   


    貌似java.io.Externalizable可以自定义序列化不过我认为照你这样做java与c通信应该是不行的,因为数据类型的表示方法都不一样
    比如说String,在C里就是一个字符数组,但是在java里面是一个对象,两者的二进制不是等效的所以,我觉得应该使用JNI来做