C++ 如何序列化套接字编程的8位整数结构?

C++ 如何序列化套接字编程的8位整数结构?,c++,sockets,serialization,struct,C++,Sockets,Serialization,Struct,我有一个结构,它有5个无符号8位整数,模拟一个有5个数据包的帧。经过研究,我知道需要逐字段序列化数据,特别是因为我正在从Windows机器发送到Linux机器,然后再发送回来 这是我的结构: typedef struct pressure{ UINT8 a; UINT8 b; UINT8 c; UINT8 d; UINT8 e; }pressure; 问题是我不能使用htons(),因为我的成员

我有一个结构,它有5个无符号8位整数,模拟一个有5个数据包的帧。经过研究,我知道需要逐字段序列化数据,特别是因为我正在从Windows机器发送到Linux机器,然后再发送回来

这是我的结构:

typedef struct pressure{
    UINT8       a;
    UINT8       b;
    UINT8       c;
    UINT8       d;
    UINT8       e;
}pressure;

问题是我不能使用htons(),因为我的成员必须是8位。如何手动序列化此文件?如果您能提供一个简短的代码示例,演示如何序列化以及发送内容(),我们将不胜感激

如果要从基于Intel x86的计算机发送到另一台Intel x86计算机(大多数Linux都是这样),只需编写它即可

但是,如果您计划将其发送到基于另一个处理器的机器,最安全的做法是只发送ASCI字符,例如:

 char[] buffer = sprintf("|%03d|%03d|%03d|%03d|%03d|",a,b,c,d,e);

将为您提供一个任何机器都可以读取的固定长度字符串。最好使用某种字段分隔符(本例中的“|”)来帮助接收方验证字符串是否被不可靠的网络篡改

如果要从基于Intel x86的计算机发送到另一台Intel x86计算机(大多数Linux都是这样),只需编写它即可

但是,如果您计划将其发送到基于另一个处理器的机器,最安全的做法是只发送ASCI字符,例如:

 char[] buffer = sprintf("|%03d|%03d|%03d|%03d|%03d|",a,b,c,d,e);

将为您提供一个任何机器都可以读取的固定长度字符串。最好使用某种字段分隔符(本例中的“|”)来帮助接收方验证字符串是否被不可靠的网络篡改

如果要从基于Intel x86的计算机发送到另一台Intel x86计算机(大多数Linux都是这样),只需编写它即可

但是,如果您计划将其发送到基于另一个处理器的机器,最安全的做法是只发送ASCI字符,例如:

 char[] buffer = sprintf("|%03d|%03d|%03d|%03d|%03d|",a,b,c,d,e);

将为您提供一个任何机器都可以读取的固定长度字符串。最好使用某种字段分隔符(本例中的“|”)来帮助接收方验证字符串是否被不可靠的网络篡改

如果要从基于Intel x86的计算机发送到另一台Intel x86计算机(大多数Linux都是这样),只需编写它即可

但是,如果您计划将其发送到基于另一个处理器的机器,最安全的做法是只发送ASCI字符,例如:

 char[] buffer = sprintf("|%03d|%03d|%03d|%03d|%03d|",a,b,c,d,e);

将为您提供一个任何机器都可以读取的固定长度字符串。最好使用某种字段分隔符(本例中的“|”)来帮助接收方验证字符串是否被不可靠的网络篡改

您可以使用编写每个字节,或者-如果您已确保它们在
pressure
中的内存中是连续的(这将在我使用过的每个编译器上完成,而您没有主动执行任何操作)-使用编写大量字节,如:

my_ostream.write(静态浇铸和my_pressure.a),5);

这样说,考虑将这些值保持在一个数组中,这样就保证它们在内存中是连续的。


您不需要
htonX
/
ntohX
等-它们用于规范化/非规范化多字节整数表示,这里没有这些表示。

您可以使用写入每个单独的字节,或者-如果您已确保它们在
压力中的内存中是连续的
(这将在我使用过的每一个编译器上完成,而你不主动地做任何事情)-使用编写大量的编译器,如:

my_ostream.write(静态浇铸和my_pressure.a),5);

这样说,考虑将这些值保持在一个数组中,这样就保证它们在内存中是连续的。


您不需要
htonX
/
ntohX
等-它们用于规范化/非规范化多字节整数表示,这里没有这些表示。

您可以使用写入每个单独的字节,或者-如果您已确保它们在
压力中的内存中是连续的
(这将在我使用过的每一个编译器上完成,而你不主动地做任何事情)-使用编写大量的编译器,如:

my_ostream.write(静态浇铸和my_pressure.a),5);

这样说,考虑将这些值保持在一个数组中,这样就保证它们在内存中是连续的。


您不需要
htonX
/
ntohX
等-它们用于规范化/非规范化多字节整数表示,这里没有这些表示。

您可以使用写入每个单独的字节,或者-如果您已确保它们在
压力中的内存中是连续的
(这将在我使用过的每一个编译器上完成,而你不主动地做任何事情)-使用编写大量的编译器,如:

my_ostream.write(静态浇铸和my_pressure.a),5);

这样说,考虑将这些值保持在一个数组中,这样就保证它们在内存中是连续的。


你不需要
htonX
/
ntohX
等-它们用于规范化/非规范化多字节整数表示,这里没有。uint8在所有计算机上都是相同的,没有被误解的危险。在DEC VAX上肯定不同!不同的方式?这种差异对程序来说是可见的吗通过TCP/IP网络向VAX发送8位值?@Jeremy——啊,你可能在DEC CPU上写的是奇怪的字节顺序。UINT8在所有计算机上都是相同的,没有被误解的危险。在DEC VAX上肯定不同!如何不同?对于通过TCP向VAX发送8位值的程序来说,这种差异是可见的吗TCP/IP网络?@Jeremy--啊,你可能在DEC CPU上写的是奇怪的字节顺序。UINT8在所有计算机上都是一样的,没有被误解的危险。在DEC VAX上肯定不同!如何不同?通过TCP/IP网络向VAX发送8位值的程序会看到这种差异吗?@Jeremy--啊,是的可能在DEC CPU上写的是奇怪的字节顺序。UINT8在所有计算机上都是相同的,没有d