ReedSolomon 2.0.0

dotnet add package ReedSolomon --version 2.0.0
                    
NuGet\Install-Package ReedSolomon -Version 2.0.0
                    
This command is intended to be used within the Package Manager Console in Visual Studio, as it uses the NuGet module's version of Install-Package.
<PackageReference Include="ReedSolomon" Version="2.0.0" />
                    
For projects that support PackageReference, copy this XML node into the project file to reference the package.
<PackageVersion Include="ReedSolomon" Version="2.0.0" />
                    
Directory.Packages.props
<PackageReference Include="ReedSolomon" />
                    
Project file
For projects that support Central Package Management (CPM), copy this XML node into the solution Directory.Packages.props file to version the package.
paket add ReedSolomon --version 2.0.0
                    
#r "nuget: ReedSolomon, 2.0.0"
                    
#r directive can be used in F# Interactive and Polyglot Notebooks. Copy this into the interactive tool or source code of the script to reference the package.
#:package ReedSolomon@2.0.0
                    
#:package directive can be used in C# file-based apps starting in .NET 10 preview 4. Copy this into a .cs file before any lines of code to reference the package.
#addin nuget:?package=ReedSolomon&version=2.0.0
                    
Install as a Cake Addin
#tool nuget:?package=ReedSolomon&version=2.0.0
                    
Install as a Cake Tool

Reed-Solomon Algorithm Implementation

This project is a C# implementation of the Reed-Solomon error correction algorithm, based on Backblaze's original Java implementation. The library provides robust error correction capabilities and includes comprehensive unit tests.

Description

This implementation simplifies integration of Reed-Solomon error correction into your applications.

If you find this project helpful, please consider starring it and sharing it with others.

Installation

To install the Reed-Solomon library, simply add it to your project using NuGet Package Manager:

Install-Package Witteborn.ReedSolomon

Usage

Using the Reed-Solomon library is straightforward. Here's a simple example of how to encode and decode data:

Managed Example: Byte

Console.WriteLine("Managed Example SByte");
Console.WriteLine("---------------------");
const int dataShardCount = 4;
const int parityShardCount = 2;

// Initialize Reed-Solomon with data shards and parity shards
ReedSolomon rs = new ReedSolomon(dataShardCount, parityShardCount);

// Example data to encode
byte[] data = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16 };
Console.WriteLine("Data:");
Console.WriteLine(string.Join(" ", data));
var paddingSize = rs.GetPaddingSize(data.Length);
Console.WriteLine("Padding size: " + paddingSize);

// Encode the data using ManagedEncode to produce shards
var shards = rs.ManagedEncode(data);

Console.WriteLine("Encoded Data:");

foreach (var shard in shards)
{
    Console.WriteLine(string.Join(" ", shard));
}

// Simulate loss of one shard 
shards[1] = null;

Console.WriteLine("Encoded with missing Data:");
foreach (var shard in shards)
{
    if (shard == null)
    {
        Console.WriteLine("null");
    }
    else
    {
        Console.WriteLine(string.Join(" ", shard));
    }
}

// Decode the remaining shards using ManagedDecode to recover original data
var decodedData = rs.ManagedDecode(shards, paddingSize: paddingSize);

Console.WriteLine("Decoded data:");
Console.WriteLine(string.Join(" ", decodedData));

Managed Example: SByte

Console.WriteLine("Managed Example SByte");
Console.WriteLine("---------------------");
const int dataShardCount = 4;
const int parityShardCount = 2;

// Initialize Reed-Solomon with data shards and parity shards
ReedSolomon rs = new ReedSolomon(dataShardCount, parityShardCount);

// Example data to encode
sbyte[] data = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16 };
Console.WriteLine("Data:");
Console.WriteLine(string.Join(" ", data));
var paddingSize = rs.GetPaddingSize(data.Length);
Console.WriteLine("Padding size: " + paddingSize);

// Encode the data using ManagedEncode to produce shards
var shards = rs.ManagedEncode(data, dataShardCount, parityShardCount);

Console.WriteLine("Encoded Data:");

foreach (var shard in shards)
{
    Console.WriteLine(string.Join(" ", shard));
}

// Simulate loss of one shard 
shards[1] = null;

Console.WriteLine("Encoded with missing Data:");
foreach (var shard in shards)
{
    if (shard == null)
    {
        Console.WriteLine("null");
    }
    else
    {
        Console.WriteLine(string.Join(" ", shard));
    }
}

// Decode the remaining shards using ManagedDecode to recover original data
var decodedData = rs.ManagedDecode(shards, dataShardCount, parityShardCount, paddingSize: paddingSize);

Console.WriteLine("Decoded data:");
Console.WriteLine(string.Join(" ", decodedData));

Manual Example: SByte

Console.WriteLine("Example SByte");
Console.WriteLine("-------------");

const int dataShardCount = 4;
const int parityShardCount = 2;
const int shardSize = 4;

// Create the shards array with data and empty parity shards
sbyte[][] shards =
{
    new sbyte[] { 0, 1, 2, 3 },
    new sbyte[] { 4, 5, 6, 7 },
    new sbyte[] { 8, 9, 10, 11 },
    new sbyte[] { 12, 13, 14, 15 },
    new sbyte[shardSize], // Parity shard 1
    new sbyte[shardSize]  // Parity shard 2
};

Console.WriteLine("Shards:");
foreach (var shard in shards)
{
    Console.WriteLine(string.Join(" ", shard));
}

// Initialize Reed-Solomon with data shards and parity shards
ReedSolomon rs = new ReedSolomon(dataShardCount, parityShardCount);

// Encode the data with Reed-Solomon to generate parity shards
rs.EncodeParity(shards, 0, shardSize);

Console.WriteLine("Encoded data:");
foreach (var shard in shards)
{
    Console.WriteLine(string.Join(" ", shard));
}

// Simulate loss of one shard (e.g., network transmission loss)
shards[1] = null; // Simulating the shard is lost

Console.WriteLine("Encoded with missing Data:");
foreach (var shard in shards)
{
    if (shard == null)
    {
        Console.WriteLine("null");
    }
    else
    {
        Console.WriteLine(string.join(" ", shard));
    }
}

bool[] shardPresent = shards.Select(shard => shard != null).ToArray();

//Manual null fix
for (int i = 0; i < shards.Length; i++)
{
    if (shards[i] == null)
    {
        shards[i] = new sbyte[shardSize];
    }
}

// Decode the remaining shards to recover original data
rs.DecodeMissing(shards, shardPresent, 0, shardSize);

// Print the decoded data (should match original data)
Console.WriteLine("Decoded data:");
foreach (var shard in shards.Where(s => s != null))
{
    Console.WriteLine(string.Join(" ", shard));
}

Contribution

Contributions via pull requests are welcome. Please open an issue first and review our Contribution Guidelines and Code of Conduct.

Support

For assistance, refer to our Support file.

Security

To report security issues or vulnerabilities, refer to our Security file.

Acknowledgments

  • Backblaze for the original Java implementation that inspired this project.

And a big Thank You to all contributors, issue reporters, and supporters who have helped make this project possible.

Product Compatible and additional computed target framework versions.
.NET net5.0 was computed.  net5.0-windows was computed.  net6.0 was computed.  net6.0-android was computed.  net6.0-ios was computed.  net6.0-maccatalyst was computed.  net6.0-macos was computed.  net6.0-tvos was computed.  net6.0-windows was computed.  net7.0 is compatible.  net7.0-android was computed.  net7.0-ios was computed.  net7.0-maccatalyst was computed.  net7.0-macos was computed.  net7.0-tvos was computed.  net7.0-windows was computed.  net8.0 is compatible.  net8.0-android was computed.  net8.0-browser was computed.  net8.0-ios was computed.  net8.0-maccatalyst was computed.  net8.0-macos was computed.  net8.0-tvos was computed.  net8.0-windows was computed.  net9.0 is compatible.  net9.0-android was computed.  net9.0-browser was computed.  net9.0-ios was computed.  net9.0-maccatalyst was computed.  net9.0-macos was computed.  net9.0-tvos was computed.  net9.0-windows was computed.  net10.0 is compatible.  net10.0-android was computed.  net10.0-browser was computed.  net10.0-ios was computed.  net10.0-maccatalyst was computed.  net10.0-macos was computed.  net10.0-tvos was computed.  net10.0-windows was computed. 
.NET Core netcoreapp2.0 was computed.  netcoreapp2.1 was computed.  netcoreapp2.2 was computed.  netcoreapp3.0 was computed.  netcoreapp3.1 was computed. 
.NET Standard netstandard2.0 is compatible.  netstandard2.1 was computed. 
.NET Framework net461 was computed.  net462 was computed.  net463 was computed.  net47 was computed.  net471 was computed.  net472 was computed.  net48 was computed.  net481 was computed. 
MonoAndroid monoandroid was computed. 
MonoMac monomac was computed. 
MonoTouch monotouch was computed. 
Tizen tizen40 was computed.  tizen60 was computed. 
Xamarin.iOS xamarinios was computed. 
Xamarin.Mac xamarinmac was computed. 
Xamarin.TVOS xamarintvos was computed. 
Xamarin.WatchOS xamarinwatchos was computed. 
Compatible target framework(s)
Included target framework(s) (in package)
Learn more about Target Frameworks and .NET Standard.
  • .NETStandard 2.0

    • No dependencies.
  • net10.0

    • No dependencies.
  • net7.0

    • No dependencies.
  • net8.0

    • No dependencies.
  • net9.0

    • No dependencies.

NuGet packages

This package is not used by any NuGet packages.

GitHub repositories

This package is not used by any popular GitHub repositories.

Version Downloads Last Updated
2.0.0 175 3/29/2026
1.4.0 1,473 12/8/2025
1.3.0 895 6/11/2025
1.2.1 662 1/1/2025
1.2.0 504 11/12/2024
1.1.0 667 8/10/2024
1.0.0 350 6/29/2024