1
4
你应该调查一下 Google protocol buffers 或者像另一张海报上说的那样序列化。 如果你想自己滚,请做对。
如果使用stdint.h中的类型(即:
在上一个工作中,我们通过XML定义的数据总线(以太网、CANBUS、ByteLight或串行端口)发送了所有结构。有一个解析器可以验证结构中变量的对齐情况(如果有人写了错误的XML,就会向您发出警报),然后为各种平台和语言生成头文件来发送和接收结构。这起作用了 真的? 对我们来说,我们 从未 不得不担心手工编写代码来进行消息解析或打包,并且可以保证所有平台都不会有愚蠢的小编码错误。我们的一些数据链路层的带宽非常有限,因此我们实现了比特字段等功能,解析器为每个平台生成适当的代码。我们还进行了枚举,这非常好(您可能会惊讶,人工对枚举上的位字段进行编码是多么容易)。 除非您需要担心它在8051s和HC11s上运行,使用C,或者在带宽非常受限的数据链路层上运行,否则您不会想到比协议缓冲区更好的东西,您只需要花费大量时间来尝试与它们并驾齐驱。 |
2
8
正确、盲目地忽略对齐可能会导致问题。即使在同一操作系统上,如果两个组件是用不同的编译器或不同的编译器版本编译的。
最好…
一个好的起点是 Boost Serialization . |
3
4
今天,我们使用直接覆盖在内存中二进制包上的打包结构,我很后悔我决定这么做的那一天。唯一的方法就是:
如果你刚开始的话,我建议你跳过那些试图用结构来表示电线上的东西的混乱。只需分别序列化每个基本元素。如果您选择不使用现有的库(如boost serialize)或中间件(如tibco),那么通过在隐藏序列化方法细节的二进制缓冲区周围编写一个抽象来节省您的许多麻烦。针对如下界面:
你们每个人
小包裹
类将具有一个方法来序列化到
另一个要避免的陷阱是使用
这仍然是很好的平台不可知论,因为数字表示总是逻辑上的大尾数。这段代码也非常适合使用基于基元类型大小的模板(想想
|
4
2
我的经验是,优先采用以下方法(按优先顺序):
尝试在没有任何中介的情况下发送原始二进制数据几乎肯定会导致许多问题。 |
5
1
如果您想要任何类型的可移植性,实际上就不能使用类或结构来实现这一点。在您的示例中,根据您的系统,ints可以是32位或64位。你很可能使用的是一个小的endian机器,但是旧的苹果Mac是big endian。编译器也可以随意填充。 通常,在确保使用n2hll、n2hl或n2hs获得正确的字节顺序之后,需要一种方法将每个字段一次写入缓冲区一个字节。 |
6
1
如果在结构中没有自然对齐,编译器通常会插入填充,以便对齐正确。但是,如果使用pragma对结构进行“打包”(移除填充),可能会产生非常有害的副作用。在PowerPC上,不对齐的浮动会生成异常。如果你在一个不处理这个异常的嵌入式系统上工作,你会得到一个重置。如果有 是 一个处理中断的程序,它可以 彻底地 降低代码的速度,因为它将使用一个软件例程来解决未对准问题,这将悄悄地削弱您的性能。 |
mig21 bis · 带套接字的SSL_set_fd地址边界错误 2 年前 |
hollow · 在读写C中的套接字时,为什么要使用循环缓冲区? 2 年前 |
Filipe · 通过http python发送图像 6 年前 |
Mr. Rogers · epoll_wait事件的epoll顺序 6 年前 |
Michael Beer · 查找插座的传输类型 6 年前 |