java - C 中的未知字节写入结构

标签 java c struct arrays

我正在向服务器发送一个具有写入功能的 C 结构。结构和写入看起来像这样。

typedef struct MyStruct {
    uint8_t         flag; 
    char            str[50];
    int32_t         number;
    time_t          time; 

} MyStruct ;

...

// Create mystruct

memset(&mystruct->flag,   '\1', sizeof(uint8_t));
memset(&mystruct->str, '\0', sizeof(char) * 50);
memset(&mystruct->number, '\2', sizeof(int32_t)); 
memset(&mystruct->time,   '\3', sizeof(time_t)); 

write(sockfd, mystruct, sizeof(MyStruct)); 

在 Java 中,服务器接收 nio ByteBuffer 中的信息,然后使用 ByteBuffer.array 获取 byte[]。当我检查 byte[] 时,它的内容是:

[ 0]         = 1
[ 1] to [50] = 0
[51]         = 70
[52] to [55] = 2
[56] to [63] = 3

如果将长度相加 1 + 50 + 4 + 8 得到 63,但奇数 70 字节的长度为 64。

这里为什么是70字节?它与网络或 C 结构有关吗?还有,如果可以的话,如何摆脱它?

最佳答案

Why is the 70 byte here? Does it have something to do with networking or c structs? Also how, if I can, get rid of it?

可能与结构有关padding .如果是这种情况,您可以尝试分别序列化结构的每个成员。

还有 here这篇文章很好地解释了 C 中序列化的所有缺陷。

C 中的序列化比 C# 中的序列化更棘手,或者我认为在 Java 中也是如此,例如在 C# 中,您知道整数的大小始终为 4 个字节,而在 C 中并非如此,整数的大小可以变化在平台上。

关于java - C 中的未知字节写入结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38130626/

相关文章:

java - Dropwizard 注册两个类/客户端

java - Spring Security - antMatcher 的 POST 方法(不是 antMatchers)

c++ - OS X 上的 LLVM 与 clang

go - 如何确保在结构中定义字段?

c - 如何将数组放入结构体中? (在C中)

java - 无法获取Web服务的输出

java - 无法创建表 'basque30.newreferral'(错误号 : 150)

c - G.711 实现 A 律

c - 如何在代码中使用白色

c - 尝试打印结构元素,但结果为空白。 - C