将long和time_t的大小定义为4bytes

时间:2017-07-16 14:28:44

标签: c

我想将两个Raspberry Pi与C程序同步。它工作正常,如果程序只在Pi上运行,但是对于开发我想使用我的PC(它也更容易调试),但我通过线路直接发送timespec结构作为二进制。覆盆子长时间使用4字节和time_t,我的PC每个使用8字节...所以他们不会聚在一起。

是否可以将long和time_t分别设置为4byte,仅适用于此C脚本?

我知道长,短等的大小是由系统定义的。

重要提示:我只想在脚本中定义一次,而不是每次都将其转换为uintXX或int。

2 个答案:

答案 0 :(得分:2)

在编程中,需要将网络传输与内存处理分开处理并不罕见。事实上,它几乎是常态。因此,建议将其转换为正确字节顺序和大小的网络格式,同时帮助您完成接口的抽象。

如果这不是一个时间关键的数据交换,你也可以考虑转换为纯文本。它使调试变得更容易。

答案 1 :(得分:-3)

C可能不是这里工作的最佳工具。提供自动数据序列化(如JavaScript,Python或类似的更抽象语言)的程度太低了。

您不能假设timespec的定义在不同平台上是相同的。首先,int的大小将根据32/64位体系结构而有所不同,您也可能遇到字节序问题。

如果要在异构平台之间交换数据结构,则需要使用明确的数据和明确的字节序约定来定义自己的协议。

一种解决方案是将数字作为ASCII发送。效率不是很高,但如果它只是一些价值观,谁在乎呢?

另一种方法是使用(u)intXX_t字段创建交换结构。 您可以假设一个标准的覆盆子内核将像您的PC一样使用小端,但如果您正在编写一个小型交换协议,那么您最好添加几个htonl/ntohl以获得良好的衡量标准。