解析二进制数据的C

Parsing Binary Data in C

本文关键字:数据 二进制      更新时间:2023-10-16

我有一个消息的自定义二进制协议和二进制规范。二进制协议为每条消息添加一些报头。该信息相对较大,包含近50个不同的字段。我的要求是解析只有2个字段从二进制消息在c或c++与gcc编译器在linux 2.6.x。

一个开发人员创建了一个表示头的类和另一个表示消息的c++类。在收到消息后,他只需对字节有效负载使用static_cast来返回一个消息类。一旦获得消息对象类,他只需使用pointertommessage . getfieldname()来获取数据。

对上一段的更正。开发人员为消息创建了一个结构,而不是一个类。结构使用gcc的__attribute__ ((__packed__))。

我的问题是,使用static_cast会导致整个消息被解析,或者解析发生在访问时间,例如,在pointerToStruct。字段名吗?此外,他还计算了这两个操作的时间,发现执行static_cast几乎不需要时间,其中通过pointerToStruct.fieldName访问字段大约需要120微秒。为什么进入一个场地要花很长时间?

我的问题是,使用static_cast会导致整个消息被解析

。static_cast只告诉编译器,被强制转换的指针所指向的内存内容应该被视为包含了强制转换为的格式的数据。如果数据不是这种格式,很可能会输出垃圾。

如果您100%确定传入缓冲区也包含被强制转换类型的正确数据,则这是访问数据的有效方法。但是既然你谈论消息和协议,我会仔细检查像端序、对齐、填充和字长这样的事情在系统通信中不会妨碍。

此外,他还计算了这两个操作的时间,发现执行static_cast几乎不需要时间,其中通过pointerToMessage.getFieldName()访问字段大约需要120微秒。为什么进入一个场地要花很长时间?

可能是因为这个强制转换没有做很多事情,本质上它只是创建一个给定类型的指针,指向你给它的内存地址。真正的访问发生在您尝试读取消息内容时。