Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/334.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/vim/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java C写结构中的未知字节_Java_C_Struct_Bytearray - Fatal编程技术网

Java C写结构中的未知字节

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, '

我正在向服务器发送一个带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,   '\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[]
。当我检查
字节[]
时,它的内容是:

[ 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的布拉格语包,但通常建议不要使用