C 中的未知字节写入结构

Unknown Byte in C write struct

我正在向服务器发送一个包含写入的 c 结构。结构和写入看起来像这样。

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

} MyStruct ;

...

// Create mystruct

memset(&mystruct->flag,   '', sizeof(uint8_t));
memset(&mystruct->str, '[=10=]', sizeof(char) * 50);
memset(&mystruct->number, '', sizeof(int32_t)); 
memset(&mystruct->time,   '', sizeof(time_t)); 

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

服务器,在Java,接收nioByteBuffer中的信息,然后用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 是一个 post,它很好地解释了 C 中序列化的所有缺陷。

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

几乎可以肯定是由于结构填充;最有可能的是,您的 compiler/processor 需要 32 位值进行 32 位对齐,因此由于您的 uint8_tchar[50] 加起来为 51 个字节,因此 [= 之间有一个字节填充=12=] 和 number

如评论中所述 - 您确实希望明确处理您的序列化。有许多库可以处理定义 Java 和 C/C++ 类型,以及每种语言中 serialize/deserialize 的方法。