相关疑难解决方法(0)

学习编写一个编译器

首选语言:C/C++,Java和Ruby.

我正在寻找一些有用的书籍/教程,如何编写自己的编译器只是为了教育目的.我最熟悉C/C++,Java和Ruby,所以我更喜欢涉及这三者之一的资源,但任何好的资源都是可以接受的.

language-agnostic compiler-construction

699
推荐指数
29
解决办法
29万
查看次数

Can Boost Spirit可用于解析字节流数据吗?

可以使用Spirit(Boost C++库的一部分)来解析来自流的二进制数据吗?例如,它可以用于将来自套接字的数据解析为结构,字节和单个位标志吗?谢谢!

c++ parsing stream boost-spirit

8
推荐指数
2
解决办法
4848
查看次数

规范驱动的数据包格式解析?

这可能是黑暗中的一个镜头:我们有一个设计和流量的线包格式.是否有一种灵活的方法来指定和解析传入流而不是对其进行编码?优选语言不可知......但不一定如此.如果有充分理由不这样做,请也赐教.

谢谢

奥利弗

python java networking

8
推荐指数
1
解决办法
320
查看次数

用C/C++解析二进制消息流

我正在为二进制协议(Javad GRIL协议)编写解码器.它由大约一百条消息组成,数据格式如下:

struct MsgData {
    uint8_t num;
    float x, y, z;
    uint8_t elevation;
    ...
};
Run Code Online (Sandbox Code Playgroud)

这些字段是ANSI编码的二进制数,它们彼此之间没有间隙.解析此类消息的最简单方法是将输入的字节数组转换为适当的类型.问题是流中的数据是打包的,即未对齐的.

在x86上,这可以通过使用来解决#pragma pack(1).但是,这在某些其他平台上不起作用,或者由于未对齐数据而导致性能开销.

另一种方法是为每种消息类型编写一个特定的解析函数,但正如我所提到的,该协议包含数百条消息.

另一种选择是使用类似Perl unpack()函数的东西并在某处存储消息格式.说,我们可以#define MsgDataFormat "CfffC"再打电话unpack(pMsgBody, MsgDataFormat).这要短得多,但仍然容易出错并且多余.此外,格式可能更复杂,因为消息可以包含数组,因此解析器将是缓慢而复杂的.

有没有共同有效的解决方案?我已经阅读了这篇文章,并用Google搜索,但没有找到更好的方法来做到这一点.

也许C++有一个解决方案?

c c++ binary parsing memory-alignment

6
推荐指数
2
解决办法
7848
查看次数

用C++解析二进制消息.任何包含示例的lib?

我正在寻找在C++中解析二进制消息的任何示例库.大多数人要求读取二进制文件或在套接字中接收的数据,但我只需要解码一组二进制消息.有人提到了boost :: spirit,但我找不到合适的例子来满足我的需求.

例如:9A690C12E077033811FFDFFEF07F042C1CE0B704381​​E00B1FEFFF78004A92440

其中前8位是前同步码,接下来是6位msg ID(0到63之间的整数),接下来的212位是数据,最后24位是CRC24.

所以在这种情况下,msg 26,我必须从212个数据位获取这些数据:

  • 4位整数值
  • 4位整数值
  • 从0到63.875的9位浮点值,其中LSB为0.125
  • 4位整数值

编辑:我需要在位级操作,因此memcpy不是一个好的解决方案,因为它复制了许多字节.要获得第一个4位整数值,我应该从一个字节获得2位,从下一个字节获得另外2位,移位每一对并组成.我要求的是一种更优雅的方法来提取值,因为我有大约20种不同的消息,并希望达到一个通用的解决方案来解析它们的位级别.

等等.

你知道os可以轻松实现这个吗?

我还发现了其他使用static_cast的Q/A. 我用Google搜索,并且对于推荐这种方法的每个人,还有另一个关于端序的警告.由于我已经有了我的消息,我不知道这样的警告是否适用于我,或者只是用于套接字通信.

编辑:提升:dynamic_bitset看起来很有希望.任何使用它的帮助?

c++ parsing bit-manipulation

4
推荐指数
1
解决办法
2475
查看次数

读取结构定义的二进制文件

有人能指出我如何读取由C结构定义的二进制文件的正确方向吗?它在结构体内部有一些#define,这使我的事情变得复杂.
结构看起来像这样:(虽然它比它更大,更复杂)

struct Format {
    unsigned long str_totalstrings;
    unsigned long str_name;
    #define STR_ORDERED 0x2
    #define STR_ROT13 0x4
    unsigned char stuff[4];
    #define str_delimiter stuff[0]
}
Run Code Online (Sandbox Code Playgroud)

如果有人能指出我如何做到这一点的正确方向,我将非常感激.或者如果那里有任何涵盖这个主题的教程?

非常感谢您的帮助.

c++ binary data-structures

3
推荐指数
1
解决办法
5990
查看次数