我正在向服务器发送一个具有写入功能的 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/