Simple Binary Encoding (SBE) - High Performance Message Codec

Simple Binary Encoding (SBE)

Javadocs GitHub

Actions Status Total Alerts Code Quality: Java

SBE is an OSI layer 6 presentation for encoding and decoding binary application messages for low-latency financial applications. This repository contains the reference implementations in Java, C++, Golang, and C#.

More details on the design and usage of SBE can be found on the Wiki.

An XSD for SBE specs can be found here. Please address questions about the specification to the SBE FIX community.

For the latest version information and changes see the Change Log with downloads at Maven Central.

The Java and C++ SBE implementations work very efficiently with the Aeron messaging system for low-latency and high-throughput communications. The Java SBE implementation has a dependency on Agrona for its buffer implementations. Commercial support is available from [email protected].

Binaries

Binaries and dependency information for Maven, Ivy, Gradle, and others can be found at http://search.maven.org.

Example for Maven:

<dependency>
    <groupId>uk.co.real-logic</groupId>
    <artifactId>sbe-all</artifactId>
    <version>${sbe.tool.version}</version>
</dependency>

Build

Build the project with Gradle using this build.gradle file.

Full clean build:

$ ./gradlew

Run the Java examples

$ ./gradlew runJavaExamples

Distribution

Jars for the executable, source, and javadoc for the various modules can be found in the following directories:

sbe-benchmarks/build/libs
sbe-samples/build/libs
sbe-tool/build/libs
sbe-all/build/libs

An example to execute a Jar from command line using the 'all' jar which includes the Agrona dependency:

java -Dsbe.generate.ir=true -Dsbe.target.language=Cpp -Dsbe.target.namespace=sbe -Dsbe.output.dir=include/gen -Dsbe.errorLog=yes -jar sbe-all/build/libs/sbe-all-${SBE_TOOL_VERSION}.jar my-sbe-messages.xml

C++ Build using CMake

NOTE: Linux, Mac OS, and Windows only for the moment. See FAQ. Windows builds have been tested with Visual Studio Express 12.

For convenience, the cppbuild script does a full clean, build, and test of all targets as a Release build.

$ ./cppbuild/cppbuild

If you are comfortable using CMake, then a full clean, build, and test looks like:

$ mkdir -p cppbuild/Debug
$ cd cppbuild/Debug
$ cmake ../..
$ cmake --build . --clean-first
$ ctest

Note: The C++ build includes the C generator. Currently, the C generator is a work in progress.

Golang Build

First build using Gradle to generate the SBE jar and then use it to generate the golang code for testing.

$ ./gradlew
$ ./gradlew generateGolangCodecs

For convenience on Linux, a gnu Makefile is provided that runs some tests and contains some examples.

$ cd gocode
# make # test, examples, bench

Users of golang generated code should see the user documentation.

Developers wishing to enhance the golang generator should see the developer documentation

C# Build

Users of CSharp generated code should see the user documentation.

Developers wishing to enhance the CSharp generator should see the developer documentation

License (See LICENSE file for full license)

Copyright 2013-2021 Real Logic Limited.
Copyright 2017 MarketFactory Inc.

Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at

https://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.

Owner
Real Logic
Commercial support and development for Aeron & SBE
Real Logic
Comments
  • [C++] Undefined behaviour in generated code

    [C++] Undefined behaviour in generated code

    The C++ code generator typically generates code like this for accessing integer fields:

        std::int32_t securityID(void) const
        {
            return SBE_LITTLE_ENDIAN_ENCODE_32(*((std::int32_t *)(m_buffer + m_offset + 24)));
        }
    
        NewOrderSingle &securityID(const std::int32_t value)
        {
            *((std::int32_t *)(m_buffer + m_offset + 24)) = SBE_LITTLE_ENDIAN_ENCODE_32(value);
            return *this;
        }
    

    The compiler assumes that a pointer to a int32_t has the correct alignment. With this generated code the alignment requirement might not fulfilled. On amd64 this is fine as long as the compiler doesn't try to use SSE or AVX instructions, but it's not safe in general to assume it will work.

    The solution is to use memcpy like this (https://chromium.googlesource.com/chromium/src.git/+/master/base/bit_cast.h):

    template <class Dest, class Source>
    inline Dest bit_cast(const Source& source) {
       static_assert(sizeof(Dest) == sizeof(Source),
       "bit_cast requires source and destination to be the same size");
       static_assert(base::is_trivially_copyable<Dest>::value,
       "bit_cast requires the destination type to be copyable");
       static_assert(base::is_trivially_copyable<Source>::value,
       "bit_cast requires the source type to be copyable");
        
       Dest dest;
       memcpy(&dest, &source, sizeof(dest));
       return dest;
    }
    

    This should optimize to a single load load on amd64, guaranteed not to use instructions requiring alignment.

  • C++ Generated code encoding and decoding issue.

    C++ Generated code encoding and decoding issue.

    I found an issue in the c++ generated code. The positionptr is not correctly updated after a string is written to the buffer, this will cause the first repeating to be written out of position. The byte positions for the root items and the first repeating group should be constant, therefore the need to use the positionptr is unnecessary. The following repeating groups position should be calculated based on the size of the previous repeating group. This will make all the fields accessible without priming the positionptr

  • New Rust code generator

    New Rust code generator

    This PR provides full SBE code generation support for the Rust programming language.

    • generates 100% safe rust code
    • the rust code generated has zero dependencies on any external rust libs
    • both lib.rs and Cargo.toml files are generated so projects can easily add codec as a dependency
    • Fixes #813

    Testing

    # following will write generated code to "./generated/rust"
    ./gradlew generateRustCodec
    
    # assuming you have "rust" and "cargo" already installed
    cd ./rust
    cargo test
    
  • sbe-tool nuget package is DOA

    sbe-tool nuget package is DOA

    When using the sbe-tool from the latest sbe-tool nuget package: 0.1.12-1-beta-1, code generation immediately fails

    Exception in thread "main" java.lang.NoClassDefFoundError: org/agrona/MutableDirectBuffer
            at uk.co.real_logic.sbe.SbeTool.<clinit>(SbeTool.java:82)
    Caused by: java.lang.ClassNotFoundException: org.agrona.MutableDirectBuffer
            at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:583)
            at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:178)
            at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:521)
            ... 1 more
    

    It seems that the nuget package contains the WRONG jar, it should have contained the jar from the: sbe-all/build/libs/ folder which contains all the required java deps, but instead it uses the jar from the sbe-tool/build/libs/ folder which is partial as far as running the complete sbe-tool is...

    Would it be OK for me submit a PR that fixes this and for someone who has access to the nuget account (I presume @billsegall) to publish an updated nuget package?

    As far as I can tell, this thing is dead out of water from nuget....

  • C++ Segmentation fault printing XML sub group (parent message prints fine)

    C++ Segmentation fault printing XML sub group (parent message prints fine)

    I'm processing an MDIncrementalRefreshBook46 message. It contains two XML sub-groups: NoMDEntries followed-by NoOrderIDEntries.

    I create the MDIncrementalRefreshBook46 object and print it. I then iterate through the second XML sub-group and read the referenceID and OrderUpdateAction:

    mktdata::MDIncrementalRefreshBook46 msg;
    msg.wrapForDecode(bytes, offset, blockLength, mktdata::MessageHeader::sbeSchemaVersion(), bufferSize);
    std::cout << msg << std::endl;
    
    mktdata::MDIncrementalRefreshBook46::NoOrderIDEntries& mboEntries = msg.noOrderIDEntries();
    while(mboEntries.hasNext())
    {
        mktdata::MDIncrementalRefreshBook46::NoOrderIDEntries& mboEntry = mboEntries.next();
        const uint8_t referenceID = mboEntry.referenceID();
        std::cout << "referenceID: " << referenceID << std::endl;
        const mktdata::OrderUpdateAction::Value updateAction = mboEntry.orderUpdateAction();
        std::cout << "updateAction: " << updateAction << std::endl;
    }
    

    The parent message prints fine:

    {"Name": "MDIncrementalRefreshBook46", "sbeTemplateId": 46, "TransactTime": 1592154621498375773, "MatchEventIndicator": ["lastQuoteMsg"], "NoMDEntries": [{"MDEntryPx": {"mantissa": 302375000000000}, "MDEntrySize": 10, "SecurityID": 19074, "RptSeq": 1, "NumberOfOrders": 1, "MDPriceLevel": 1, "MDUpdateAction": "New", "MDEntryType": "Bid"}], "NoOrderIDEntries": [{"OrderID": 646981700454, "MDOrderPriority": 8786193103, "MDDisplayQty": 10, "ReferenceID": 1, "OrderUpdateAction": "New"}]}

    but if I try to retrieve the referenceID I get a null/0 (should be 1) and when reading the OrderUpdateAction I get an invalid value and an exception throw in OrderUpdateAction::get().

    This could be misuse on my part, but I can't see what I'm doing wrong?

  • problem using cppbuild on Linux

    problem using cppbuild on Linux

    Hi,

    I am trying to build sbe project on Linux with gradle-5.6.3 by following README.md instructions. gradle itself was built successfully and the daemon is running.

    When I execute ./cppbuild/cppbuild I get the following:

    ./cppbuild/cppbuild Will make with "-j 4". Build directory (/home/vladt/encode/simple-binary-encoding-master/cppbuild/Release) exists, removing. -- The C compiler identification is GNU 4.4.7 -- The CXX compiler identification is GNU 4.4.7 -- Check for working C compiler: /usr/bin/cc -- Check for working C compiler: /usr/bin/cc -- works -- Detecting C compiler ABI info -- Detecting C compiler ABI info - done -- Detecting C compile features -- Detecting C compile features - done -- Check for working CXX compiler: /usr/bin/c++ -- Check for working CXX compiler: /usr/bin/c++ -- works -- Detecting CXX compiler ABI info -- Detecting CXX compiler ABI info - done -- Detecting CXX compile features -- Detecting CXX compile features - done -- Looking for pthread.h -- Looking for pthread.h - found -- Looking for pthread_create -- Looking for pthread_create - not found -- Looking for pthread_create in pthreads -- Looking for pthread_create in pthreads - not found -- Looking for pthread_create in pthread -- Looking for pthread_create in pthread - found -- Found Threads: TRUE
    -- Found Java: /usr/local/java/jdk1.8.0_45/bin/java (found version "1.8.0.45") -- Looking for clock_gettime in rt -- Looking for clock_gettime in rt - found Build type(Release): perf tests turning OFF bounds checks -- Configuring done -- Generating done -- Build files have been written to: /home/vladt/encode/simple-binary-encoding-master/cppbuild/Release Scanning dependencies of target gtest Scanning dependencies of target sbe-jar [ 2%] Creating directories for 'gtest' [ 4%] Generating SBE jar [ 6%] Performing download step (verify and extract) for 'gtest' -- verifying file... file='/home/vladt/encode/simple-binary-encoding-master/cppbuild/googletest-release-1.8.0.zip' -- verifying file... done -- extracting... src='/home/vladt/encode/simple-binary-encoding-master/cppbuild/googletest-release-1.8.0.zip' dst='/home/vladt/encode/simple-binary-encoding-master/cppbuild/Release/thirdparty/gtest/src/gtest' -- extracting... [tar xfz]

    FAILURE: Build failed with an exception.

    • What went wrong: Task 'test' not found in root project 'sbe'.

    • Try: Run gradlew tasks to get a list of available tasks. Run with --stacktrace option to get the stack trace. Run with --info or --debug option to get more log output. Run with --scan to get full insights.

    • Get more help at https://help.gradle.org

    BUILD FAILED in 1s make[2]: *** [../../sbe-all/build/libs/sbe-all-1.15.0-SNAPSHOT.jar] Error 1 make[1]: *** [CMakeFiles/sbe-jar.dir/all] Error 2 make[1]: *** Waiting for unfinished jobs.... -- extracting... [analysis] -- extracting... [rename] -- extracting... [clean up] -- extracting... done [ 10%] No patch step for 'gtest' [ 10%] No update step for 'gtest' [ 12%] Performing configure step for 'gtest' -- gtest configure command succeeded. See also /home/vladt/encode/simple-binary-encoding-master/cppbuild/Release/thirdparty/gtest/src/gtest-stamp/gtest-configure-.log [ 14%] Performing build step for 'gtest' -- gtest build command succeeded. See also /home/vladt/encode/simple-binary-encoding-master/cppbuild/Release/thirdparty/gtest/src/gtest-stamp/gtest-build-.log [ 16%] No install step for 'gtest' [ 18%] Completed 'gtest' [ 18%] Built target gtest make: *** [all] Error 2

    Is task 'test' missing from distribution?

    I must add that I am new to gradle so any relevant help will be appreciated.

    Thanks, Vlad

  • [C#] Added more string read/write methods to the DirectBuffer #729

    [C#] Added more string read/write methods to the DirectBuffer #729

    Address #729

    • Added DirectBuffer methods for reading and writing string that need encoding.
    • Added convenience accessors for the various Encodings defined in the schema.
    • Changed the C# Code generator to create read/write methods using the new DirectBuffer methods.
    • Changed the sample to use the new methods.

    The suggestions that the ticket creator had require .net48+ as far as I can see - using the Encoding.GetString() methods. I kept with the current .net45 version and implmented the 'spirit' of of the request.

  • SBE 1.20.3 is generating C++ code with incorrect macro __cplucplus

    SBE 1.20.3 is generating C++ code with incorrect macro __cplucplus

    Below is a sample of generated code. The macro is missing a "s"

    Needs to be __cplusplus instead of _cplucplus

    #if __cpluplus >= 201703L length += std::apply(SymbolResponses::computeLength, e); #else length += SymbolResponses::computeLength(std::get<0>(e), std::get<1>(e)); #endif

  • [C++] constexpr qualifier in static const field getters

    [C++] constexpr qualifier in static const field getters

    This is a follow up enhancement to the #195 issue.

    I am tailoring the incoming message reaction, and it would be great to use a switch statement in the vein of the structurechart's comment. Similarly to @structurechart I ran into the constexpr requirement.

    Would it be possible to discuss a solution similar to the sample commit vdidenko/[email protected]? It introduces public constexpr fields and uses them to maintain the getter function signatures.

    I have only changed the fields I think I care about, but should I make the pull request similarly modifying all static const declarations touched by the original solution at real-logic/[email protected]?

  • (C++) No version-checking code generated for group fields

    (C++) No version-checking code generated for group fields

    While there are xxxSinceVersion() and xxxInActingVersion() methods to check before decoding top-level fields, there are no such methods generated for groups in C++.

  • 2 repos?

    2 repos?

    Sorry to ask again about that but I'm still not convinced about having a separate repo for the benchmarks, for a few reasons:

    • people who want to evaluate SBE have to clone 2 repos instead of one. I'm not sure everyone will go through the process of cloning the main one, discovering that the benchmarks are not there and clone the other repo (if they find it!) to then run the tests What they should be able to do is clone the repo, type something like "ant java:bench" and get everything build and running, benchmarks included.
    • when I change the code gen I'd like to be able to run the perf tests immediately to validate that perf has not regressed. At the moment it's a multi step process (generate new sbe.jar, generate new .NET dlls, copy over to other repo, build benchmark).
    • things can easily get out of sync: we are 3 devs updating sbe.jar and for instance on the .NET side I need the corresponding sbe.ddl and sbe.pdb to be up to date.
    • I'm working from another repository and other contributors will do the same. It's quite an overhead to have to manage 2 repos instead of one: for instance if I change the code generation I need to
      1. change the code in the main repo
      2. build
      3. copy sbe.jar and others to the bench repo
      4. build and run perf tests (if there is a problem back to step 1)
      5. commit changes in main repo to origin (my fork of sbe)
      6. commit changes in bench repo to origin (my fork)
      7. prepare and send 2 pull requests

    I understand that we want to keep the repo clean of third party dependencies like Google Proto Buff and others but we can download them on demand during the build instead of storing them in Git.

    I see more problems than advantages working that way and I find it quite painful at the moment, especially while things are still changing a lot.

    What do you guys think?

  • [Java] safer method for decoding repeating groups

    [Java] safer method for decoding repeating groups

    Would you accept a PR to generate an additional method to make it safer to decode repeating groups?

    By safer, I mostly mean preventing accidentally not completely decoding a group, or otherwise messing up the required order of invocation.

    For CarDecoder it might be used like:

    carDecoder.decodeGroups(
        (count) -> newEncoder.newMpgEncoder(count),
        (newMpgEncoder, fuelFiguresDecoder) -> newMpgEncoder.next().mpg(fuelFiguresDecoder.mpg()),
        IGNORE_A_COUNT,
        IGNORE_A_GROUP
    );
    

    And the generated code would be like:

    public <R> void decodeGroups(
        IntFunction<R> fuelFiguresInit,
        BiConsumer<R, FuelFiguresDecoder> fuelFiguresConsumer,
        IntFunction<R> performanceFiguresInit,
        BiConsumer<R, PerformanceFiguresDecoder> performanceFiguresConsumer)
    {
            FuelFiguresDecoder fuelFigures = fuelFigures();
            BiConsumer<R, FuelFiguresDecoder> fuelFiguresConsumer = fuelFiguresInit.apply(fuelFigures.count());
            while (fuelFigures.hasNext())
            {
                fuelFiguresConsumer.accept(consumer, fuelFigures.next());
            }
    
            PerformanceFiguresDecoder performanceFigures = performanceFigures();
            BiConsumer<R, PerformanceFiguresDecoder> performanceFiguresConsumer = performanceFiguresInit.apply(performanceFigures.count());
            while (performanceFigures.hasNext())
            {
                performanceFiguresConsumer.accept(performanceFiguresConsumer, performanceFigures.next());
            }
    }
    
    //of course next bit need not be generated for each decoder:
    public static final IntFunction IGNORE_A_COUNT = i -> null;
    public static final BiConsumer IGNORE_A_GROUP = (x,y) -> {};
    

    I understand this would involve breaking compilation if a new group is added to the schema without an accompanying code change. If that's undesirable, we could instead use a "fluent" approach, in which each method returns something that only has the next appropriate method. The disadvantage of that approach would be needing an extra interface (or class) for each repeating group. If there's any interest, I could give more detail about how that might look...

  • How do I stream in SBE message that was streamed out to re-create the C++ object

    How do I stream in SBE message that was streamed out to re-create the C++ object

    Currently SBE is generating C++ header file to stream out the message. It is very good feature but only half. Where is the other half to re-create the object by streaming in the message that was streamed out earlier? I think stream in will improve usability of SBE in C++ multi-fold.

  • [C#] Add missing generated code comments

    [C#] Add missing generated code comments

    For a few generated methods, including the new string-based setter/getters that I recently added, the method comments are missing.

        /// <summary>
        /// Vehicle code from Car
        /// </summary>
        public Span<byte> VehicleCodeAsSpan()
        {
            return _buffer.AsSpan<byte>(_offset + 28, VehicleCodeLength);
        }
    
        public int GetVehicleCode(byte[] dst, int dstOffset)
        {
              const int length = 6;
              return GetVehicleCode(new Span<byte>(dst, dstOffset, length));
        }
    
        public int GetVehicleCode(Span<byte> dst)
        {
            const int length = 6;
            if (dst.Length < length)
            {
                ThrowHelper.ThrowWhenSpanLengthTooSmall(dst.Length);
            }
        
            _buffer.GetBytes(_offset + 28, dst);
            return length;
        }
       
        public void SetVehicleCode(byte[] src, int srcOffset)
        {
            SetVehicleCode(new ReadOnlySpan<byte>(src, srcOffset, src.Length - srcOffset));
        }
        
        public void SetVehicleCode(ReadOnlySpan<byte> src)
        {
            const int length = 6;
            if (src.Length > length)
            {
                ThrowHelper.ThrowWhenSpanLengthTooLarge(src.Length);
            }
        
            _buffer.SetBytes(_offset + 28, src);
        }
        
        public void SetVehicleCode(string value)
        {
            _buffer.SetNullTerminatedBytesFromString(VehicleCodeResolvedCharacterEncoding, value, _offset + 28, VehicleCodeLength, VehicleCodeNullValue);
        }
        public string GetVehicleCode()
        {
            return _buffer.GetStringFromNullTerminatedBytes(VehicleCodeResolvedCharacterEncoding, _offset + 28, VehicleCodeLength, VehicleCodeNullValue);
        }
    
  • [Go] no zero-copy?

    [Go] no zero-copy?

    I generated Go code and see there is no Wrap() method. Instead, there is Encode(io.Reader), which fetches and assigns all values to public fields in the model. Is there no zero-copy alternative in Go, that allows to read the data in-place?

  • [C#] String extraction/setting impossible without memory allocation with current API

    [C#] String extraction/setting impossible without memory allocation with current API

    Using your example in the documentation

    // Create a vehicle code of the correct encoding
    VehicleCode = Encoding.GetEncoding(Car.VehicleCodeCharacterEncoding).GetBytes("abcdef");
    car.SetVehicleCode(vehicleCode, 0); // second argument is offset
    

    This is terrible. It defeats the whole point of SBE because it uses a method GetBytes() which allocates a new array of bytes, and then copies that to the direct buffer we are targeting. We should be using this method to get the number of bytes which a particular string would generate. We should then check that against the size available, and use this method to write to the underlying buffer.

    In order to do this, we need to be able to access the underlying byte array for the DirectBuffer, and it would be best to do this through support in the generated classes.

    I can't see any way of writing a string into one of the generated classes without having auxiliary buffers of bytes hanging around if I want to avoid allocations, the way the accessor methods are currently provided.

    Similarly to read a string, your example is

    var vehicleCode = new byte[Car.VehicleCodeLength];
    car.GetVehicleCode(vehicleCode, 0);
    sb.Append(Encoding.GetEncoding(Car.VehicleCodeCharacterEncoding).GetString(vehicleCode, 0, Car.VehicleCodeLength));
    

    Which suffers from the same problem... We should be using this method to generate a string directly (perhaps having first looked through the buffer for a terminating \0 character to establish how many of the available bytes actually comprise the string we want to extract)

  • Typed enumerations for C++

    Typed enumerations for C++

    When generating enumerations for C++, is it possible to generate typed enumerations?

    I mean to generate:

    enum Color : uint8_t { BLUE = 0, GREEN = 1, ... }

    instead of

    enum Color { BLUE = (std::uint8_t)0, GREEN = (std::uint8_t)1, ... }

Fast Binary Encoding is ultra fast and universal serialization solution for C++, C#, Go, Java, JavaScript, Kotlin, Python, Ruby, Swift

Fast Binary Encoding (FBE) Fast Binary Encoding allows to describe any domain models, business objects, complex data structures, client/server request

Dec 1, 2022
Zmeya is a header-only C++11 binary serialization library designed for games and performance-critical applications

Zmeya Zmeya is a header-only C++11 binary serialization library designed for games and performance-critical applications. Zmeya is not even a serializ

Nov 2, 2022
Cista is a simple, high-performance, zero-copy C++ serialization & reflection library.

Simple C++ Serialization & Reflection. Cista++ is a simple, open source (MIT license) C++17 compatible way of (de-)serializing C++ data structures. Si

Dec 1, 2022
Consistent Hashing Using Fibonacci Encoding

fibonacci_table This does not work as I thought it would. I did not manage to compute an inverse fibonacci mapping. It works, but just like linear has

Jan 30, 2021
A C++11 ASN.1 BER Encoding and Decoding Library

fast_ber A performant ASN.1 BER encoding and decoding library written in C++11 Introduction fast_ber is a small, lightweight library for BER encoding

Dec 1, 2022
Base64 Encoding implementation in C Programming Language

cb64 Base64 Encoding implementation in C Programming Language Spec: https://datatracker.ietf.org/doc/html/rfc4648#page-5 Header only So just copy cb64

Dec 14, 2021
Like my previous encoding project but actually likely finishedable. Also in C++.

EncodedCPP Like my previous encoding project but actually likely finishedable. Also in C++. Now with encoding and decoding options. Saving codes has a

Jan 1, 2022
RLE-encoding/decoding for files in C

RLE-encoding RLE-encoding/decoding for files in C My version of file encoding/decoding as an assignment for Metropolia UAS in C-programming course . T

Aug 26, 2022
A high performance C++14 library for effortlessly reading and writing UBJSON

UbjsonCpp A high performance C++14 library for effortlessly reading and writing UBJSON This library implements UBJSON Draft 12 and Value semmantics Ab

Aug 2, 2022
High-performance specialized replacements for PHP's pack() and unpack() functions

ext-encoding High-performance specialized replacements for PHP's pack() and unpack() functions Under a profiler, it becomes obvious that PHP's pack()

Sep 17, 2022
Your binary serialization library

Bitsery Header only C++ binary serialization library. It is designed around the networking requirements for real-time data delivery, especially for ga

Dec 1, 2022
Binary Serialization

Binn Binn is a binary data serialization format designed to be compact, fast and easy to use. Performance The elements are stored with their sizes to

Nov 24, 2022
Utility to convert any binary file into C source that can be compiled and linked to the executable.

bin2c Utility to convert any binary file into C source that can be compiled and linked to the executable. bin2o Utility to convert any binary file int

Jul 14, 2021
C++17 library for all your binary de-/serialization needs

blobify blobify is a header-only C++17 library to handle binary de-/serialization in your project. Given a user-defined C++ struct, blobify can encode

Oct 20, 2022
Nov 28, 2022
Simple C++ 20 Serialization Library that works out of the box with aggregate types!

BinaryLove3 Simple C++ 20 Serialization Library that works out of the box with aggregate types! Requirements BinaryLove3 is a c++20 only library.

Sep 2, 2022
C++ library for getting full ROS message definition or MD5 sum given message type as string

rosmsg_cpp C++ library for getting full message definition, MD5 sum and more given just the message type as string. This package provides both C++ lib

Jan 5, 2022
Nov 29, 2021
Fast Binary Encoding is ultra fast and universal serialization solution for C++, C#, Go, Java, JavaScript, Kotlin, Python, Ruby, Swift

Fast Binary Encoding (FBE) Fast Binary Encoding allows to describe any domain models, business objects, complex data structures, client/server request

Dec 1, 2022
This is like Inverting Binary Tree, but instead of a Binary Tree it's a File Tree.
This is like Inverting Binary Tree, but instead of a Binary Tree it's a File Tree.

Invert File Tree in C++ This is like Inverting Binary Tree, but instead of the Binary Tree it's a File Tree. This is intended as a simple exercise to

Nov 23, 2022