Análisis de protocolo FAST (2) Importar datos de análisis de plantilla

 disparates

Sigue siendo la misma oración, los documentos que se encuentran en Internet son menos que el cabello del monje, así que vamos a roer el código fuente. Después de mucho tiempo, finalmente roí una clase: XMLMessageTemplateLoader

Así es, literalmente significa convertir el archivo template.xml directamente en un objeto de plantilla. Mi tarea principal es analizar, es decir, los datos y la plantilla están listos. Solo necesito analizar el flujo de datos a través de la plantilla. K vio esto y luego lo combinó con el método del artículo anterior. debería ser capaz de analizarlo Me parece que veo el amanecer de la victoria.

Después de mi operación feroz, la realidad me dio un boca grande: La plantilla con id 0 no ha sido registrada

La plantilla no ha registrado 0. Esta plantilla, estoy atónito, no tengo tal cosa, busqué mucho en Internet y finalmente encontré a un tipo grande que ha estado estudiando esto durante mucho tiempo ( https : //github.com /kuangtu/fixfast ), Eché un vistazo al código de muestra escrito por el tipo grande. En solo unas pocas líneas, hay pistas sobre la vida entre líneas... fuera de tema, el código de muestra escrito por el tipo grande es básicamente el mismo que el mío. ¿Por qué? Él puede hacer lo que yo puedo, pero el proveedor de datos no puede mentirme y darme datos falsos a propósito, ¿verdad?

Los datos se obtienen de la Bolsa de Valores de Shanghái. El documento proporcionado por la Bolsa de Valores de Shanghái dice que habrá un Tag96 del protocolo STEP. El valor de este Tag96 es un flujo del protocolo FAST. Luego transferiré los datos de Tag96 del flujo de protocolo STEP proporcionado por la Bolsa de Valores de Shanghái. Lo saqué, analicé, fallé, analicé, fallé, analicé fallé, quién sabe cuántas posiciones cambié, todavía no estaba embarazada... falló al analizar con éxito.

Más tarde, guardé el flujo de Tag96 en un archivo, y cuando iba a analizarlo a través del archivo, de repente descubrí que la cadena convertida de Tag96 parecía familiar, y todavía comenzaba con "8=", que es PASO. ¿Qué pasa con el acuerdo? Esto es una estafa, y el documento que entregó no decía que él era una matrioska, y se acordó prohibir las matrioskas.

Al final, saqué Tag96 y ejecuté el código para analizar el protocolo STEP nuevamente, y luego saqué un Tag96 y lo analicé, y luego el análisis fue exitoso. De hecho, el método original era realmente correcto. La falla no fue nada. más que eso, la fuente de datos cavó un agujero para mí.

Código de muestra

Vayamos primero al código del tipo grande y agreguemos algunas líneas de comentarios que no necesito como referencia personal.

        //从文件中导入模板,自己注意一下路径即可
     	InputStream templateSource = new FileInputStream("data/RDDFastTemplates-1.1.xml");
		XMLMessageTemplateLoader templateLoader = new XMLMessageTemplateLoader();
		templateLoader.setLoadTemplateIdFromAuxId(true);
		//载入模板
		templateLoader.load(templateSource);
		
		System.out.println("the tamplate count is" + templateLoader.getTemplateRegistry().getTemplates().length);
		
		//载入数据源
		InputStream is = new FileInputStream("data/fastdata.bin");
		MessageInputStream mis = new MessageInputStream(is);
		//注册模板
		mis.setTemplateRegistry(templateLoader.getTemplateRegistry());
		
		Message md = null;
		int iCount = 0;
		//打开debug追踪开关,显示字段信息
		mis.getContext().setTraceEnabled(true);
		
		//循环解析,直到解析完
		while((md = mis.readMessage()) != null)
		{
			System.out.println("the mesage template id is: " + md.getTemplate().getId());
		}

En mi código, no hay mucha diferencia.

        //用糊涂工具类取文件,模板路径为源代码的:resources/template/template.xml
        ClassPathResource classPathResource = new ClassPathResource("template/template.xml");
        InputStream inputStream = classPathResource.getStream();
        //一个模板文件可能包含多个模板,我这里只有1个,省事就直接搞了
        MessageTemplate template = new XMLMessageTemplateLoader().load(inputStream)[0];

        Context context = new Context();
        context.registerTemplate(4001, template);

        try {
            //数据源byte[]
            InputStream sbs = new ByteArrayInputStream(buff);
            //解码器
            FastDecoder fastDecoder = new FastDecoder(context, sbs);
            //重置一下状态,理论上是没解析一条需要重置一次
            //fastDecoder.reset();
            //解码
            Message msg111 = fastDecoder.readMessage();
            log.info("解码的消息1:{}", msg111.getString(1));
        } catch (Exception e) {
            e.printStackTrace();
        }

Supongo que te gusta

Origin blog.csdn.net/qq_33601179/article/details/122360190
Recomendado
Clasificación