2011-12-27 92 views
1

我有一个消息的自定义二进制协议和二进制规范。二进制协议为每条消息添加一些标题。该消息相对较大,包含近50个不同的字段。我的要求是在linux 2.6.x上用c或C++中的gcc编译器仅解析二进制消息中的2个字段。解析C中的二进制数据

一位开发人员创建了一个表示标题的类,另一个表示该消息的C++类。收到消息后,他只是在字节有效载荷上使用static_cast来取回消息类。一旦他获得了消息对象类,他只需使用pointerToMessage.getFieldName()来获取数据。

上段的更正。开发人员创建了一个结构,而不是该消息的类。该结构使用gcc的__attribute __((__ packed__))。

我的问题是,将使用static_cast结果在整个消息得到解析或解析发生在访问时间,例如,在pointerToStruct.fieldName?另外,他定时进行了2次操作,发现几乎没有时间做static_cast,在这里大约需要120微妙的时间通过pointerToStruct.fieldName来访问字段。为什么要进入一个领域需要很长时间?

+1

为什么static_cast会执行解析? – Pubby 2011-12-27 22:01:56

+0

我很抱歉,因为我不是C++开发人员,而且编码人员不可用。因此,上面的问题。那么,解析是在访问时发生的吗? – Jimm 2011-12-27 22:06:56

+1

@Jimm:到目前为止您所描述的任何内容都涉及解析。 – ildjarn 2011-12-27 22:07:41

回答

2

我的问题是,将使用整个消息的static_cast结果得到解析

号的唯一的static_cast告诉存储器内容通过被投的指针指向的编译器应该被看作它包含您输入的格式的数据。如果数据不是这种格式,那么您很可能会被垃圾弄掉。

如果您100%确定传入缓冲区包含正在投射类型的正确数据,则这是访问数据的有效方式。但是既然你谈论消息和协议,我会仔细检查一下,在系统通信中不会妨碍端到端,对齐,填充和词组化等事情。

此外,他定时执行了2个操作,发现它几乎没有时间去做static_cast,在这里大约需要120微妙的时间通过pointerToMessage.getFieldName()访问字段。为什么要进入一个领域需要很长时间?

可能是因为tha cast realy没有做太多的事情,本质上它只是创建一个指定类型的指针给你给它的内存地址。当您尝试阅读邮件的内容时,会发生真正的访问。