728x90
반응형
728x90
반응형
728x90
반응형

Bitsery 소개

  • 링크 : https://github.com/fraillt/bitsery

  • 헤더(header) 전용 C++ 이진 직렬화(binary serialization) 라이브러리.

  • 실시간 데이터 전송, 특히 게임의 네트워킹 요구 사항을 중심으로 설계되었습니다.

  • 모든 크로스 플랫폼 요구 사항은 컴파일 타임에 시행되므로 직렬화된 데이터는 메타 데이터 정보를 저장하지 않으며 가능한 작습니다.

특징

  • 크로스 플랫폼 호환
  • 속도와 공간에 최적화되었습니다.
  • 코드 생성이 필요하지 않습니다. IDL이나 메타 데이터가 없어도 직접 유형을 사용하십시오.
  • 직렬화 해제시 구성 가능한 런타임 오류 점검.
  • 스트림 (파일, 네트워크 스트림 등 ...) 또는 버퍼 (벡터, c- 어레이 등) 등 모든 소스에서 읽고 쓸 수 있습니다.
  • 사용하지 않는 것에 대한 비용을 지불하지 마십시오! -확장을 통해 직렬화를 사용자 정의하십시오. 몇 가지 주목할만한 확장은 다음을 허용합니다.
    • 유형에 대한 순방향 / 역방향 호환성.
    • 맞춤형 런타임 다형성을 지원하는 스마트하고 생생한 포인터.
    • 세분화 된 비트 수준 직렬화 제어.
  • 모든 유형에 쉽게 확장 할 수 있습니다.
  • 직렬화 제어를 개선하기 위해 간단한 구문 및 / 또는 자세한 구문을 허용합니다.
  • 구성 가능한 엔디안 지원.
  • 매크로가 없습니다.

bitery 를 사용하는 이유

  • 숫자와 기능 목록을 보고 스스로 결정하십시오.
data size serialize deserialize
bitsery 6913B 1252ms 1170ms
bitsery_compress 4213B 1445ms 1325ms
boost 11037B 9952ms 8767ms
cereal 10413B 6497ms 5470ms
flatbuffers 14924B 6762ms 2173ms
yas 10463B 1352ms 1109ms
yas_compress 7315B 1673ms 1598ms
  • GCC 8.3.0으로 Ubuntu에서 벤치마킹 한 자세한 내용은 here 를 참조하십시오.

  • 여전히 확신이 없다면 라이브러리 동기 부여 섹션에서 더 많은 것을 읽으십시오.

사용 예

#include <bitsery/bitsery.h>
#include <bitsery/adapter/buffer.h>
#include <bitsery/traits/vector.h>

enum class MyEnum:uint16_t { V1,V2,V3 };
struct MyStruct {
    uint32_t i;
    MyEnum e;
    std::vector<float> fs;
};

template <typename S>
void serialize(S& s, MyStruct& o) {
    s.value4b(o.i);
    s.value2b(o.e);
    s.container4b(o.fs, 10);
}

using namespace bitsery;

using Buffer = std::vector<uint8_t>;
using OutputAdapter = OutputBufferAdapter<Buffer>;
using InputAdapter = InputBufferAdapter<Buffer>;

int main() {
    MyStruct data{8941, MyEnum::V2, {15.0f, -8.5f, 0.045f}};
    MyStruct res{};

    Buffer buffer;

    auto writtenSize = quickSerialization<OutputAdapter>(buffer, data);
    auto state = quickDeserialization<InputAdapter>({buffer.begin(), writtenSize}, res);

    assert(state.first == ReaderError::NoError && state.second);
    assert(data.fs == res.fs && data.i == res.i && data.e == res.e);
}

사용 방법

요구사항

  • 추가 종속성 없이 C++11 컴파일러와 함께 작동하며 <bitsery/bitsery.h> 가 포함되어 있습니다.

    일부 bitsery 확장은 더 높은 버전의 C++ 표준(예: StdVariant)이 필요할 수 있습니다.

플랫폼

  • 이 라이브러리는 다음에서 테스트되었습니다
    • Windows: Visual Studio 2015, MinGW (GCC 5.2)
    • Linux: GCC 5.4, GCC 6.2, Clang 3.9
    • OS X Mavericks: AppleClang 8

라이센스

  • bitsery 는 MIT license 입니다.
728x90
반응형

'C C++' 카테고리의 다른 글

[리눅스] C++ 에서 칼라 글자 출력  (0) 2021.05.16
나노로그(NanoLog)  (0) 2020.03.03
C++ std::any  (0) 2019.08.22
libcurl 빌드 하기 (Visual Sutdio)  (0) 2019.08.15
Serial (KMDF) sample driver's DriverEntry routine  (0) 2019.01.17
728x90
반응형

QSLogLib

  • 홈페이지 : https://github.com/JayTwoLab/QSLogLib

  • QSLogLib는 SLogLib를 Qt로 이식한 로깅 라이브러리 입니다.

  • 향상된 장치와 기능으로 Qt로 포팅되었습니다.

노트

  • Cmake는 더 이상 지원하지 않습니다.
  • 크로스 플랫폼 지원을 위한 복잡한 코드 대신에 Qt를 사용합니다.
  • UDP 클라이언트 로거가 추가되었습니다.

예제

1️⃣ 설정 방법

  • 처음에 Qt 프로젝트 파일(*.pro)에 pri 파일을 추가합니다.
  • qmake

    # Define QSLogLib relative path. You can fix this directory
    #   QSLOG_PARENTPATH = ../../
    #   QSLOG_HEADERPATH = ../../QSLogLib/
    #   QSLOG_SOURCEPATH = ../../QSLogLib/
    include(../../QSLogLib/QSLogLib.pri)
    

2️⃣ 표준 출력/파일 로깅 예제

  • cpp

    #include <QtGlobal>
    #include <QCoreApplication>
    
    #include "QSLogLib/SLogLib.h"
    #include "QSLogLib/Devices/AbstractLoggingDevice.h"
    #include "QSLogLib/Devices/ConsoleLogger.h"
    #include "QSLogLib/Devices/FileLogger.h"
    #include "QSLogLib/Devices/UdpLogger.h"
    #include "QSLogLib/Formatters/AbstractFormatter.h"
    #include "QSLogLib/Formatters/DetailedFormatter.h"
    #include "QSLogLib/Formatters/ErrorFormatter.h"
    #include "QSLogLib/Formatters/InfoFormatter.h"
    #include "QSLogLib/Formatters/NullFormatter.h"
    
    int main(int argc, char *argv[])
    {
        QCoreApplication mainApp(argc, argv);
    
        using namespace QSLogLib;
    
        // 로깅 장치 추가 
        addLoggingDevice( new ConsoleLogger(new NullFormatter) ); // 콘솔(console) + 단순 로깅 형식(null format)
        addLoggingDevice( new FileLogger("foo.log", new DetailedFormatter) ); // 파일(file) + 자세한 로깅 형식(detailed format)
    
        // 콘솔과 파일 모두로 로그가 출력됨
        int a = 10;
        double b = 15.3;
        const char* c = "Success";
        SLOGLIB_LOG_MSG_INFO("a = " << a << " b = " << b);
        SLOGLIB_LOG_MSG_INFO(c);
    
        return 0;
    }
    

3️⃣ UDP 송신 예제

  • cpp

    int main(int argc, char *argv[])
    {
    	QCoreApplication mainApp(argc, argv);
    
    	using namespace QSLogLib;
    
    	std::string strDestAddress = "192.168.137.1";
    	unsigned short destPort = 5000;
    	addLoggingDevice(new UdpLogger(strDestAddress, destPort, new NullFormatter));
    
    	// UDP 패킷으로 로그를 송신
    	int a = 10;
    	double b = 15.3;
    	const char* c = "Success";
    	SLOGLIB_LOG_MSG_INFO("a = " << a << " b = " << b);
    	SLOGLIB_LOG_MSG_INFO(c);
    
    	return 0;
    }
    

테스트 환경

  • Qt 6.0.0 (MingW, Windows 64bit)
  • Qt 5.10.1 (MingW, Windows 32bit)
  • Qt 5.6.2 (Linux 64bit)

라이센스

  • QSLogLib는 MIT 라이센스입니다.
728x90
반응형
728x90
반응형


  • QXlsx는 엑셀 파일(*.xlsx)을 읽고 쓰는 라이브러리입니다.
    • QtXlsx가 더 이상 지원되지 않기 때문에(2014), QtXlsx에 기반한 새로운 프로젝트를 만들었습니다. (2017-)
  • QXlsx는 개발언어로 C++을 사용합니다. (Qt 사용)
  • QXlsx는 정적 또는 동적 라이브러리를 사용하지 않아도 되도록 제작되었습니다.
    • 물론 정적 라이브러리(static library)로 사용할 수도 있습니다.
728x90
반응형

+ Recent posts