java如何实现c结构体的对齐?

THEBEST 2010-10-08 01:46:43

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];
}

只能这样手工来补齐吗?
...全文
590 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
clariones 2010-10-08
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 pywepe 的回复:]

java需要你去管这些
[/Quote]

[Quote=引用 13 楼 pywepe 的回复:]

java不需要你去管这些
[/Quote]
呵呵
pywepe 2010-10-08
  • 打赏
  • 举报
回复
java不需要你去管这些
pywepe 2010-10-08
  • 打赏
  • 举报
回复
java需要你去管这些
THEBEST 2010-10-08
  • 打赏
  • 举报
回复
还是自己拼字节数组吧。。。over
lujun1985 2010-10-08
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 thebest 的回复:]

JAVA的序列化可以自定义实现么?好像implements Serializable是不能改写

private void writeObject(java.io.ObjectOutputStream out)
throws IOException
private void readObject(java.io.ObjectInputStream in)
thro……
[/Quote]

貌似java.io.Externalizable可以自定义序列化

不过我认为照你这样做java与c通信应该是不行的,因为数据类型的表示方法都不一样
比如说String,在C里就是一个字符数组,但是在java里面是一个对象,两者的二进制不是等效的

所以,我觉得应该使用JNI来做
THEBEST 2010-10-08
  • 打赏
  • 举报
回复
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通讯。如何指定字段的值传送呢?
24K純帥 2010-10-08
  • 打赏
  • 举报
回复
学习。。
clariones 2010-10-08
  • 打赏
  • 举报
回复
如果是跨语言通讯,就只有双方都遵守某个协议了。
java不存在对不对齐的问题,java连sizeof都没有,所以这些是JVM操心的事情,应用程序员不需要关心。
lujun1985 2010-10-08
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 thebest 的回复:]

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

Java通常是通过序列化serialize来将对象转换为字节数组,不是手工处理的
zrcvic 2010-10-08
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 thebest 的回复:]

当然我要发送一个结构体的话肯定是将各个字段拼成一个byte[]来发送啊。所以如何对齐还是要手工来处理吧?跟JVM有啥关系?
[/Quote]网络通信用的?用DataOutputStream怎么样?
THEBEST 2010-10-08
  • 打赏
  • 举报
回复
当然我要发送一个结构体的话肯定是将各个字段拼成一个byte[]来发送啊。所以如何对齐还是要手工来处理吧?跟JVM有啥关系?
Inhibitory 2010-10-08
  • 打赏
  • 举报
回复
1. C和Java处理内存中二进制数据的方式不一样,所以即使你传递过去了,也未必有用,即使是同一段数据,他们未必会认识对方的。
2. C中结构体的字节对齐与编译器有关。
3. 没注意过Java中是否有字节对齐,应该有吧,毕竟为了访问速度,如果没有,还真只有自己处理了。
4. 为了实现C与Java的通讯,还是自己定义一个通讯格式,C收到Java的数据后,再解析成自己的结构体。
ZangXT 2010-10-08
  • 打赏
  • 举报
回复
对齐取决与具体jvm的实现。
zrcvic 2010-10-08
  • 打赏
  • 举报
回复
这个……是什么东西…… =_="
你想实现什么效果……?

62,614

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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