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_t
和 char[50]
加起来为 51 个字节,因此 [= 之间有一个字节填充=12=] 和 number
。
如评论中所述 - 您确实希望明确处理您的序列化。有许多库可以处理定义 Java 和 C/C++ 类型,以及每种语言中 serialize/deserialize 的方法。
我正在向服务器发送一个包含写入的 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_t
和 char[50]
加起来为 51 个字节,因此 [= 之间有一个字节填充=12=] 和 number
。
如评论中所述 - 您确实希望明确处理您的序列化。有许多库可以处理定义 Java 和 C/C++ 类型,以及每种语言中 serialize/deserialize 的方法。