解析二进制数据的C
Parsing Binary Data in C
我有一个消息的自定义二进制协议和二进制规范。二进制协议为每条消息添加一些报头。该信息相对较大,包含近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微秒。为什么进入一个场地要花很长时间?
可能是因为这个强制转换没有做很多事情,本质上它只是创建一个给定类型的指针,指向你给它的内存地址。真正的访问发生在您尝试读取消息内容时。
- 如何从dicom文件中读取二进制数据
- 如何在Qt中从数据库中检索二进制数据?
- 如何使用位字段将数据从二进制文件复制到结构中?
- readsome() 适合在 Windows 上读取二进制数据吗?
- 如何使用 redis-plus-plus 存储二进制数据,就像我想存储结构一样?@for_stack?
- 在CRC-16 CCITT中将数据从二进制解码为文本,我应该输入一个码字,使用CRC生成器进行编码
- 将包含二进制数据的 QByteArray 传递到按值运行
- C++ 尝试优化每一帧将数据打印到二进制文件
- 如何在 c++ 中生成十六进制二进制数据的 sha256 哈希?
- 在处理网络、二进制数据和序列化时应使用流或容器
- 我能确定从文件中读取的 32 字节二进制数据等于 256 位吗?
- C++:如何通过 curl 调用使用 HTTP post 请求发送二进制数据(protobuf 数据)
- 使用二进制数据更新 PostgreSQL 表
- 在打印方法中,难以在二进制树中打印数据
- 使用二进制数据和无符号字符
- sd_journal_send发送二进制数据.如何使用日志检索数据?
- 从带有 std::ifstream::read() 的文件中读取 int 遍历 char * 二进制数据
- 将文本和二进制数据连接到一个文件中
- 二进制模式 + 格式化文本操作或文本模式 + 二进制数据操作 - 有意义吗?
- 如何仅使用 std::filebuf 将数据(二进制模式)写入文件