C 从32位机器传输到64位机器的通用结构

C 从32位机器传输到64位机器的通用结构,c,C,我们在32位机器上运行的代码中使用以下结构。如果我们必须将此结构传输到64位机器,是否需要进行任何更改 struct test { int num; char a; double dd; }; 我有两台机器在网络上,我有两个传输数据存储在上述结构从32位机器到64位机器,所以如何使上述结构在通用结构,使数据不会松散。。。这是我的问题。这种结构的布局完全依赖于平台,您甚至不能使用它在使用不同编译器编译的32位应用程序的两个实例之间传输数据,或者在同

我们在32位机器上运行的代码中使用以下结构。如果我们必须将此结构传输到64位机器,是否需要进行任何更改

   struct test
   {
     int num;
     char a;
     double dd;
   };

我有两台机器在网络上,我有两个传输数据存储在上述结构从32位机器到64位机器,所以如何使上述结构在通用结构,使数据不会松散。。。这是我的问题。

这种结构的布局完全依赖于平台,您甚至不能使用它在使用不同编译器编译的32位应用程序的两个实例之间传输数据,或者在同一编译器下使用不同的编译设置

这种结构在数据传输中的唯一安全使用是在同一可执行文件的多个实例之间。与中相同:相同的构建。您甚至不能保证以后的一些构建具有相同的结构


要以二进制兼容的方式传输二进制数据,您需要使用某种二进制流,它保持固定的二进制结构,与平台无关。Google Protocol Buffers就是这样的一个例子,另一个例子是Qt的
QDataStream

这种结构的布局完全依赖于平台,您甚至不能使用它在使用不同编译器编译的32位应用程序的两个实例之间传输数据,或者在同一编译器下使用不同的编译设置

这种结构在数据传输中的唯一安全使用是在同一可执行文件的多个实例之间。与中相同:相同的构建。您甚至不能保证以后的一些构建具有相同的结构


要以二进制兼容的方式传输二进制数据,您需要使用某种二进制流,它保持固定的二进制结构,与平台无关。Google Protocol Buffers就是这样的一个例子,另一个例子是Qt的
QDataStream

一般来说,该结构不足以用于网络或持久性目的,因为它在很多方面依赖于C实现(编译器+平台)

“传输”取决于您对结构和包含的元素所做的操作

这些项目应在您的检查表上:

  • 检查元素的值范围。所有使用的类型可能会改变宽度
    char
    符号可能会发生变化
  • 检查整个结构的尺寸。这对于依赖特定大小或某些任意边界的代码可能很重要
  • 离开进程的地址空间(网络或持久存储)时,请确保结构已正确迁移,包括结尾、大小和对齐方式

一切都在很大程度上取决于在不同平台上使用的C实现。

一般来说,结构不足以用于网络或持久性目的,因为它在很多方面依赖于C实现(编译器+平台)

“传输”取决于您对结构和包含的元素所做的操作

这些项目应在您的检查表上:

  • 检查元素的值范围。所有使用的类型可能会改变宽度
    char
    符号可能会发生变化
  • 检查整个结构的尺寸。这对于依赖特定大小或某些任意边界的代码可能很重要
  • 离开进程的地址空间(网络或持久存储)时,请确保结构已正确迁移,包括结尾、大小和对齐方式

一切都在很大程度上取决于不同平台上使用的C实现。

这取决于您如何使用它。整数大小可能会改变,但这不是问题,除非您根据其大小编码。如果您想要相同的整数大小,可以使用
int32\t
。这还取决于“传输此结构”的含义。如果您只是想为64位环境重新编译代码,那么该结构中没有任何固有的东西会阻止生成的程序正常工作。但是,如果您正在谈论通过二进制I/O在32位机器和64位机器之间传输数据,那么您可能确实需要更改。@John我在网络上有两台机器,我有两台以上述结构存储的数据从32位机器传输到64位机器,因此如何使上述结构成为通用结构,以便数据不会丢失。。。这是我的问题。@Avishi请编辑您的问题并添加所有此类澄清。这取决于您如何使用它。整数大小可能会改变,但这不是问题,除非您根据其大小编码。如果您想要相同的整数大小,可以使用
int32\t
。这还取决于“传输此结构”的含义。如果您只是想为64位环境重新编译代码,那么该结构中没有任何固有的东西会阻止生成的程序正常工作。但是,如果您正在谈论通过二进制I/O在32位机器和64位机器之间传输数据,那么您可能确实需要更改。@John我在网络上有两台机器,我有两台以上述结构存储的数据从32位机器传输到64位机器,因此如何使上述结构成为通用结构,以便数据不会丢失。。。这是我的问题。@Avishi请编辑您的问题,并在此处添加所有此类澄清。如果只需要支持少量特定情况,则使用自己的数据传输协议也不太困难。@JohnBollinger作为一般规则,“使用自己的[x]”是一个坏主意,因为有库可以这样做。如果这是一个小的个人项目,你知道它永远不会变得更大,那么也许。但在大多数情况下,如果你以后发现你真的想要更多的功能,那么自己写东西就有可能需要修改它。另外,一个写得好的库应该比自己做容易得多。@zstevart:取决于什么环境