예제 #1
0
 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
예제 #2
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
예제 #3
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
예제 #4
0
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)
예제 #5
0
    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
예제 #6
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)
예제 #7
0
    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]
예제 #8
0
# 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)