import ctypes
libcorrect = ctypes.CDLL('/usr/local/lib/libcorrect.dylib')
create = libcorrect.correct_convolutional_create
create.argtypes = [ctypes.c_size_t, ctypes.c_size_t, ctypes.c_void_p]
create.restype = ctypes.c_void_p
destroy = libcorrect.correct_convolutional_destroy
destroy.argtypes = [ctypes.c_void_p]
destroy.restype = None
encode_len = libcorrect.correct_convolutional_encode_len
encode_len.argtypes = [ctypes.c_void_p, ctypes.c_size_t]
encode_len.restype = ctypes.c_size_t
encode = libcorrect.correct_convolutional_encode
encode.argtypes = [ctypes.c_void_p, ctypes.c_void_p, ctypes.c_size_t, ctypes.c_void_p]
encode.restype = ctypes.c_size_t
decode = libcorrect.correct_convolutional_decode
decode.argtypes = [ctypes.c_void_p, ctypes.c_void_p, ctypes.c_size_t, ctypes.c_void_p]
decode.restype = ctypes.c_ssize_t
polynomials = (ctypes.c_uint16 * 2)(*[0161, 0127])
conv = create(2, 7, polynomials)
msg = 'Hello, World!'
payload = (ctypes.c_uint8 * len(msg)).from_buffer_copy(msg)
encoded_len = encode_len(conv, len(payload))
print 'Encoded message: %s' % msg
print 'Message length: %d bits' % (len(msg) * 8)
print 'Encoded length: %d bits' % encoded_len
encoded_len_bytes = encoded_len / 8
encoded_len_bytes += 1
encoded = (ctypes.c_uint8 * encoded_len_bytes)()
encode(conv, payload, len(payload), encoded)
encoded[3] ^= 0x40
encoded[7] ^= 0x04
decoded = (ctypes.c_uint8 * ((encoded_len/2)/8))()
decoded_len = decode(conv, encoded, encoded_len, decoded)
print 'Decoded length: %d bits' % (decoded_len * 8)
print 'Decoded message: %s' % bytearray(decoded)
encoded[2] = 0
decoded_len = decode(conv, encoded, encoded_len, decoded)
print 'Decoded length: %d bits' % (decoded_len * 8)
print 'Decoded message: %s' % bytearray(decoded)
destroy(conv)