def test_fec_encode(self): block_size = 8192 k = 10 m = 4 data = os.urandom(k * block_size) parity = bytearray(m * block_size) assert fec_encode(k, m, block_size, data, parity) == 0
def encode(self, data): """ Encodes data using Cauchy Reed Solomon codes """ block_size = compute_block_size(len(data), self.k) parity = bytearray(self.m * block_size) assert fec_encode(self.k, self.m, block_size, data, parity) == 0 strips = [] for i in range(0, len(data), block_size): strips.append(data[i: i + block_size]) for i in range(0, len(parity), block_size): strips.append(parity[i: i + block_size]) return strips
def encode_to_fec(data): block_size = 512 k = 16 # 512*16 = 8192 send all blocks of received data m = 4 parity = bytearray(m * block_size) encoded_data = fec_encode(k, m, block_size, data, parity) if encoded_data == 0: print "Encoded to FEC Data Bytes: " #, len(data), "Data Content:", data blocks = [] for row in range(k): offset = row * block_size block_data = data[offset:offset + block_size] blocks.append((row, block_data)) decode_from_fec(k, m, block_size, blocks, data)
def test_fec_decode_without_erasure(self): block_size = 8192 k = 10 m = 4 data = os.urandom(k * block_size) parity = bytearray(m * block_size) assert fec_encode(k, m, block_size, data, parity) == 0 blocks = [] for row in range(k): offset = row * block_size block_data = data[offset:offset + block_size] blocks.append((row, block_data)) assert fec_decode(k, m, block_size, blocks) == 0
def encode_to_fec(data, frame, sender): block_size = 512 global k #= 16 # 512*16 = 8192 send all blocks of received data global m #= 4 parity = bytearray(m * block_size) encoded_data = fec_encode(k, m, block_size, data, parity) if encoded_data == 0: #print "Encoded to FEC Data Bytes: "#, len(data), "Data Content:", data blocks = [] for row in range(k): offset = row * block_size block_data = data[offset:offset + block_size] blocks.append(((frame, row), block_data)) for row in range(m): offset = row * block_size block_data = parity[offset:offset + block_size] blocks.append(((frame, row + k), block_data)) #print ((row,block_data)) send_fec_data(blocks, sender)
def test_fec_decode_without_sufficient_blocks(self): block_size = 8192 k = 10 m = 4 data = os.urandom(k * block_size) parity = bytearray(m * block_size) assert parity == b'\x00' * (m * block_size) # print("original data:%r" % data[9 * block_size:9 * block_size + block_size]) assert fec_encode(k, m, block_size, data, parity) == 0 # print("parity data:%r" % parity[:block_size]) blocks = [] for row in range(k-1): offset = row * block_size block_data = data[offset:offset + block_size] blocks.append((row, block_data)) blocks.append((k, bytearray(parity[:block_size]))) assert fec_decode(k, m, block_size, blocks) == 0 offset = (k-1) * block_size assert blocks[(k-1)][1] == data[offset:offset + block_size]
# Get a file-like object to access to the stream stream = conn.create_stream() k = 8 m = 4 block_size = 128 parity = bytearray(m * block_size) data = 0 count = 0 # Read 1024 bytes of data while (count < 1): data = stream.read(1024) #print len(data) #cauchy_256_encode(k, m, data_ptrs, recovery_blocks, bytes) #_fec_encode(int k, int m, int block_size, unsigned char* data, unsigned char* parity) # print fec_encode(k, m, block_size, data, parity) #for par in parity: # print par count += 1 #print len(parity) blocks = [] # artifica=ially removed the first byte blocks.append((0, bytearray(parity[0:block_size]))) # add the remaining blocks to the transfer for row in range(k - 1): row += 1 offset = row * block_size block_data = data[offset:offset + block_size] blocks.append((row, block_data)) fec_decode(k, m, block_size, blocks)