行情解析
jvQuant行情推送用的websocket协议,行情传输使用的是无标志的压缩二进制流。需要注意解压缩的方法。
可以参考官方的Demo:GitHub - jvQuant/OpenAPIDemo jvQuant OpenAPI Demo
压缩协议
当压缩后的数据没有明确的标志位(如文件头或文件尾标记)时,解压过程通常依赖于以下几个因素:
- 了解压缩算法:
- 首先,需要明确使用的是哪种压缩算法。不同的压缩算法有不同的解压方式。在zlib的情况下,它提供了一套标准的压缩和解压函数,因此你需要确保使用的是zlib的压缩函数进行压缩的。
- 完整的压缩数据:
- 解压过程需要完整的压缩数据。如果数据在传输或存储过程中被截断或损坏,解压可能会失败。
- 压缩数据的长度:
- 在某些情况下,你可能需要知道压缩数据的长度(或至少是一个足够大的缓冲区来容纳解压后的数据)。zlib的
uncompress
函数需要知道输出缓冲区的大小,并在解压后更新这个大小以反映实际解压出的数据长度。
- 在某些情况下,你可能需要知道压缩数据的长度(或至少是一个足够大的缓冲区来容纳解压后的数据)。zlib的
- 使用正确的解压函数:
- 使用zlib进行解压时,应使用
uncompress
函数(或对于gzip格式的文件,使用inflateInit
、inflate
和inflateEnd
等函数序列)。确保调用这些函数时传入了正确的参数,包括指向压缩数据的指针、压缩数据的长度、指向解压数据缓冲区的指针以及解压数据缓冲区的大小(传址调用)。
- 使用zlib进行解压时,应使用
- 错误处理:
- 解压过程中可能会遇到各种错误,如内存不足、输出缓冲区太小、输入数据损坏等。zlib的解压函数会返回错误代码,你应该检查这些错误代码并根据需要进行错误处理。
- 示例代码:
- 你可以参考zlib的官方文档或示例代码来了解如何正确使用解压函数。以下是一个简化的示例,展示了如何使用zlib的
uncompress
函数来解压数据:
- 你可以参考zlib的官方文档或示例代码来了解如何正确使用解压函数。以下是一个简化的示例,展示了如何使用zlib的
解压方法
在Java中,如果你使用Inflater(true)
来创建一个Inflater
对象并设置nowrap
参数为true
,这意味着你正在处理一个不使用zlib包装(即没有zlib头部和校验和)的原始DEFLATE数据流。在C++中,要实现相同的解压功能,你需要使用zlib库中的inflate
函数,并适当设置其参数来模拟nowrap
模式。
然而,需要注意的是,zlib的API并不直接提供一个类似于Java Inflater(true)
的构造函数或单个函数调用来启用nowrap
模式。相反,你需要通过调用inflateInit2
(而不是inflateInit
)并指定窗口位大小(通常是MAX_WBITS
的某个值)来启用nowrap
模式。对于nowrap
模式,你应该将窗口位大小设置为-MAX_WBITS
(即-15
,如果MAX_WBITS
定义为15)
Python
Python解压缩好弄,看官方文档使用
zlib.decompress(message, -zlib.MAX_WBITS)
增加MAX_WBITS标志位即可。
PHP
PHP使用gzinflate()方法。
Golang
Golang用flate.NewReader也可以解压。
JAVA
JAVA 需要注意,需使用Inflater(true)
来创建一个Inflater
对象并设置nowrap
参数为true
,这意味着你正在处理一个不使用zlib包装(即没有zlib头部和校验和)的原始DEFLATE数据流。
Inflater inflater = new Inflater(true);
C++
C++也需要设置MAX_WBITS标志位,使用inflateInit2方法。
ret = inflateInit2(&strm, -MAX_WBITS);
参考资料
详细代码可以参考:
GitHub - jvQuant/OpenAPIDemo: jvQuant OpenAPI Demo
标签:解压,MAX,压缩,zlib,level2,WBITS,解析,jvQuant From: https://blog.csdn.net/FuckTheWindows/article/details/140396714