Java C写结构中的未知字节
我正在向服务器发送一个带write的c结构。struct和write如下所示Java C写结构中的未知字节,java,c,struct,bytearray,Java,C,Struct,Bytearray,我正在向服务器发送一个带write的c结构。struct和write如下所示 typedef struct MyStruct { uint8_t flag; char str[50]; int32_t number; time_t time; } MyStruct ; ... // Create mystruct memset(&mystruct->flag, '
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中,服务器通过nioByteBuffer
接收信息,然后通过ByteBuffer.array
获取一个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结构有关?还有,如果可以的话,如何摆脱它
为什么70字节在这里?这与网络有关吗
还是c结构?还有,如果可以的话,如何摆脱它
这可能与结构有关。如果是这样,您可以尝试分别序列化结构的每个成员
还有一篇文章很好地解释了C中序列化的所有缺陷
C语言中的序列化比C语言中的序列化要复杂得多,或者我认为Java语言中的序列化也比C语言中的序列化复杂得多,例如,在C语言中,整数的大小总是4个字节,而在C语言中,整数的大小可能因平台而异
为什么70字节在这里?这与网络有关吗
还是c结构?还有,如果可以的话,如何摆脱它
这可能与结构有关。如果是这样,您可以尝试分别序列化结构的每个成员
还有一篇文章很好地解释了C中序列化的所有缺陷
C语言中的序列化比C语言中的序列化要复杂得多,或者我认为Java语言中的序列化也比C语言中的序列化要复杂得多,例如,在C语言中,整数的大小总是4个字节,而在C语言中,整数的大小在不同的平台上是不同的;最有可能的情况是,编译器/处理器要求32位值32位对齐,因此由于
uint8\u t
和char[50]
加起来有51个字节,因此str
和number
之间有一个单字节的pad
正如评论中提到的,您确实希望显式地处理序列化。有许多库可以处理定义Java和C/C++类型,以及在每种语言中序列化/反序列化的方法。这几乎肯定是由于结构填充;最有可能的情况是,编译器/处理器要求32位值32位对齐,因此由于
uint8\u t
和char[50]
加起来有51个字节,因此str
和number
之间有一个单字节的pad
正如评论中提到的,您确实希望显式地处理序列化。有许多库可以处理定义Java和C/C++类型,以及用每种语言进行序列化/反序列化的方法。请不要这样做。你要求的是一个痛苦的世界。如果要使用发送字节流的通道,请精确定义要交换的字节流。不要说“我将发送任何C结构,并希望它恰好对另一方有意义”。除此之外,您是否意识到
memset(&mystruct->number,'\2',sizeof(int32_t))
将变量设置为0x020202
,或十进制33686018
?@WeatherVane是的,这只是我在调试它。请不要这样做。你要求的是一个痛苦的世界。如果要使用发送字节流的通道,请精确定义要交换的字节流。不要说“我将发送任何C结构,并希望它恰好对另一方有意义”。除此之外,您是否意识到memset(&mystruct->number,'\2',sizeof(int32_t))
将变量设置为0x020202
,或十进制33686018
?@WeatherVane是的,这只是我在调试它。因此,通过序列化,在C中,我应该创建一个方法,以我想要的方式创建字节数组集?@ezPaint Yes检查我的answer@ezPaint也有类似于smth的pragma pack,但通常通过C中的序列化,我应该创建一个方法,以我想要的方式创建字节数组集?@ezPaint Yes检查我的answer@ezPaint也有类似于smth的布拉格语包,但通常建议不要使用