Tabla de contenido
FAST codifica contenido de texto plano en contenido binario mediante ciertas reglas, con el propósito de comprimir datos y reducir la presión de transmisión. Al decodificar, puede utilizar algunas bibliotecas de código abierto para decodificar, como mFast (C ++), openFast está escrito en java.
1. Preparación
GitHub - computación de objetos/mFAST en v1.2.1
Primero descargue el último código fuente de mFast y luego use cmake para configurar. mFast depende de boost, por lo que debe especificar la ruta de boost al configurar, luego configurar, generar y luego abrir el proyecto con VS.
Al compilar después de abrir, se le indica que tinyxml2 no tiene código fuente. Debe descargar manualmente el código fuente de tinyxml2, colocarlo en la carpeta tinyxml2 en mFast y luego usar cmake para generarlo nuevamente.
Luego compile, el proyecto mfast_test le indicará que no se puede encontrar Catch.hpp. Este archivo también es un archivo de prueba de código abierto. Solo necesita un archivo de encabezado. Puede descargarlo desde
https://github.com/philsquared/Catch/releases/download/v1.7.2/catch.hpp
Descárgalo aquí y agrégalo al proyecto mfast_test.
Una vez completada la compilación, puede ejecutar el proyecto hello_world, que muestra un ejemplo de decodificación rápida.
Los archivos de encabezado de la biblioteca mFast y los archivos de encabezado de impulso se especifican en el directorio de inclusión del proyecto.
2. Función mFast
Proyecto hello_world: la plantilla está codificada en el código y se proporciona una parte del contenido codificado rápidamente en el código, que luego se analiza y se convierte al formato json para la salida.
proyecto fast_type_gen:
Este proyecto se utiliza para convertir plantillas xml en archivos .h, .cpp y .inl. El uso es fast_type_gen.exe template.xml
3. Decodificación
Yo mismo escribí una clase de decodificación y el archivo de encabezado de plantilla generado por include se puede decodificar.
mfastDecoder.h
#pragma once
#include"template_2_26.h"//模板头文件
#include<iostream>
#include<mFast.h>
#include <mfast/coder/fast_decoder.h>
#include <mfast/json/json.h>
class mfastDecoder
{
public:
//解码器
std::shared_ptr<mfast::fast_decoder> m_fastDecoder;
public:
mfastDecoder();
//初始化
void init();
//解码
void decoder(std::string&msg);
};
mfastDecoder.cpp
#include "mfastDecoder.h"
mfastDecoder::mfastDecoder() {
init();
}
//初始化
void mfastDecoder::init() {
const mfast::templates_description* descriptions[] = { template_2_26::description() };
m_fastDecoder = std::make_shared<mfast::fast_decoder>();
m_fastDecoder->include(descriptions);
}
//解码
void mfastDecoder::decoder(std::string&msg) {
const char* start = msg.c_str();
const char* end = start + msg.length();
bool first_quote = true;
std::ostringstream json_message;
while (start != end)
{
if (!first_quote)
{
mfast::message_cref fastMsg = m_fastDecoder->decode(start, end, false);
bool result = mfast::json::encode(json_message, fastMsg, 0);
}
else
{
// first quote need to reset FAST decoder
mfast::message_cref fastMsg = m_fastDecoder->decode(start, end, true);
bool result = mfast::json::encode(json_message, fastMsg, 0);
first_quote = false;
}
json_message << std::endl;
}
std::cout << "decoder result: \n" << json_message.str() << std::endl;
}
uso:
std::string _fast;//待解码的fast内容
//解码
mfastDecoder m;
m.decoder(_fast);
4. Resultados
Cabe señalar que si el contenido rápido a decodificar contiene un encabezado de 40 bytes que comienza con 0x0004c453, es necesario eliminarlo y analizarlo comenzando desde el área de datos.