public NativeReedSolomonImpl(IEnumerable <byte> message) { try { Message = message.ToArray(); input = new RSBuffer { Buffer = Marshal.AllocHGlobal(Marshal.SizeOf(typeof(byte)) * Message.Length), Length = Message.Length }; Marshal.Copy(Message, 0, input.Buffer, Message.Length); } catch { throw new Exception("Can not create new instance of ReedSolomonApp.NativeReedSolomonImpl"); } }
private (RSCode, IEnumerable <byte>) Encode() { if (Message == null) { #if DEBUG throw new NullReferenceException("Message equals to null"); #else return(RSCode.Unhandled, null); #endif } outEncoded = new RSBuffer(); var code = ReedSolomonEncode(input, GeneratorPolynomial, ref outEncoded); var encodedBytes = new byte[outEncoded.Length]; if (code == RSCode.Success) { Marshal.Copy(outEncoded.Buffer, encodedBytes, 0, outEncoded.Length); } return(code, encodedBytes); }
private (RSCode, IEnumerable <byte>) Decode() { if (outEncoded.Buffer == IntPtr.Zero) { #if DEBUG throw new NullReferenceException("outEncoded equals to ZERO"); #else return(RSCode.Unhandled, null); #endif } outDecoded = new RSBuffer(); var code = ReedSolomonDecode(outEncoded, GeneratorPolynomial, ref outDecoded); var decodedBytes = new byte[outDecoded.Length]; if (code == RSCode.Success) { Marshal.Copy(outDecoded.Buffer, decodedBytes, 0, outDecoded.Length); } return(code, decodedBytes); }
private static extern RSCode ReedSolomonDecode(RSBuffer input, ushort gv, ref RSBuffer output);
private static extern RSCode ReedSolomonNoise(RSBuffer buf, ushort gv, ulong ec, float freq);