什么是解码像 FAST 这样的数据协议的快速方法,其中数据以字节编码,位作为存在标志?
Posted
技术标签:
【中文标题】什么是解码像 FAST 这样的数据协议的快速方法,其中数据以字节编码,位作为存在标志?【英文标题】:What is a fast way to decode a data protocol like FAST in which data is encoded in bytes with bits as existence flags? 【发布时间】:2012-06-09 04:41:19 【问题描述】:像 FAST 这样的数据编码协议非常巧妙地减少了需要发送的数据量。本质上一个得到一个 char*,将前几个字节作为整数读取会给您一个 id 编号,该编号指向您如何解码其余字节的说明(即,它告诉您其余字节是,例如,reverseivley an int,一个字符串、一个无符号整数、另一个无符号整数、一个嵌套消息等)和接下来的几个字节(在每个位中)告诉您后续字段是否存在。每个字节中的第 8 位保留用于表示数据之间的边界。
如果不对位操作(与、或、移位、位检查)进行线性遍历,解码这样的协议似乎是不可能的……有什么方法可以更快地做到这一点?
【问题讨论】:
是什么让您认为按位运算的简单应用对您来说不够快?这些操作通常非常快。 这引起了我的注意,但您没有提供参考...这是正确的吗? en.wikipedia.org/wiki/FAST_protocol 【参考方案1】:我认为您不会找到比刚才描述的更快的技术或方法。此类协议旨在按顺序解析它们。继续搜索的唯一原因是找到一种更方便的数据处理方式。
据我所知,有三种方式:
按照下面的说明进行操作 使用低级框架,例如 Boost::Spirit,它具有 binary parsers。 尝试使用现成库:例如QuickFAST -- 原生 C++ 和 .NET 的 FAST 协议实现。【讨论】:
你认为 Boost::Spirit 二进制解析器会比在 ++-ing 指针时进行强制转换、移位和 ORing 更快吗? 显然不是。多说一句,Spirit:Qi(解析器,二进制解析器)是基于 EBNF 语法的,这确实意味着严格的解析并且非常耗时(至少在编译时)。但是使用二进制解析器可以帮助您减少编写代码的数量。【参考方案2】:如果没有线性协议,解码这样的协议似乎是不可能的 位操作的遍历(ands, ors, shifts, bit checks)...有没有 如何更快地做到这一点?
FAST 协议使用停止位方法对值进行编码,换句话说,它按顺序逐字节解析,直到遇到第 8 位设置为 1 的字节。这样做会在每个字节中丢失一点,但总体而言这是一种快速编码许多不同字段的方法,而无需在它们之间使用分隔字节。
看看on this article 来自CoralFIX 的FAST 支持。它有一个从交换 XML 模板文件生成的 FAST 解码器的 Java 代码示例。
免责声明:我是 CoralFIX 的开发者之一。
【讨论】:
以上是关于什么是解码像 FAST 这样的数据协议的快速方法,其中数据以字节编码,位作为存在标志?的主要内容,如果未能解决你的问题,请参考以下文章
Java - Java集合中的快速失败Fail Fast 机制