예제 #1
0
 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");
     }
 }
예제 #2
0
        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);
        }
예제 #3
0
        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);
        }
예제 #4
0
 private static extern RSCode ReedSolomonDecode(RSBuffer input, ushort gv, ref RSBuffer output);
예제 #5
0
 private static extern RSCode ReedSolomonNoise(RSBuffer buf, ushort gv, ulong ec, float freq);