我想将两个Raspberry Pi与C程序同步。它工作正常,如果程序只在Pi上运行,但是对于开发我想使用我的PC(它也更容易调试),但我通过线路直接发送timespec结构作为二进制。覆盆子长时间使用4字节和time_t,我的PC每个使用8字节...所以他们不会聚在一起。
是否可以将long和time_t分别设置为4byte,仅适用于此C脚本?
我知道长,短等的大小是由系统定义的。
重要提示:我只想在脚本中定义一次,而不是每次都将其转换为uintXX或int。
答案 0 :(得分:2)
在编程中,需要将网络传输与内存处理分开处理并不罕见。事实上,它几乎是常态。因此,建议将其转换为正确字节顺序和大小的网络格式,同时帮助您完成接口的抽象。
如果这不是一个时间关键的数据交换,你也可以考虑转换为纯文本。它使调试变得更容易。
答案 1 :(得分:-3)
C可能不是这里工作的最佳工具。提供自动数据序列化(如JavaScript,Python或类似的更抽象语言)的程度太低了。
您不能假设timespec
的定义在不同平台上是相同的。首先,int的大小将根据32/64位体系结构而有所不同,您也可能遇到字节序问题。
如果要在异构平台之间交换数据结构,则需要使用明确的数据和明确的字节序约定来定义自己的协议。
一种解决方案是将数字作为ASCII发送。效率不是很高,但如果它只是一些价值观,谁在乎呢?
另一种方法是使用(u)intXX_t字段创建交换结构。
您可以假设一个标准的覆盆子内核将像您的PC一样使用小端,但如果您正在编写一个小型交换协议,那么您最好添加几个htonl/ntohl
以获得良好的衡量标准。