Mit der zfec-Bibliothek habe ich versucht, einen Fehlerkorrekturcode zu generieren, der auch dann wiederhergestellt werden kann, wenn einige Daten beschädigt sind.
Die zfec-Bibliothek verwendet den RAID-5-Algorithmus, um die Datenbeschädigung wiederherzustellen. Der Raid-5-Algorithmus kann leicht durch Lesen von hier verstanden werden. Es ist ein einfacher Mechanismus, der XOR verwendet, sodass Sie ihn leicht verstehen können.
·früh ・ Es gibt APIs für Python, C, Haskel ・ Kann mit Char-Arrays umgehen
https://pypi.python.org/pypi/zfec
pip install zfec
2DataBlock
# -*- coding: utf-8 -*-
from __future__ import absolute_import, unicode_literals
import zfec
#Fehlererkennungskorrektur
data_block1 = str('aiueo')
data_block2 = str('kakik')
#Fehlererkennungscode aus den Datenblöcken 1 und 2:Generieren Sie 3
_, _, data_block3 = zfec.Encoder(2, 3).encode([data_block1, data_block2])
print 'data block 3 is... {}'.format(data_block3)
# >>> data block 3 is... uyI}g
#Datenblock 1 und Fehlererkennungscode:Stellen Sie 3 bis 2 wieder her
_, repaired_data_block2 = zfec.Decoder(2, 3).decode([data_block1, data_block3, ], [0, 2])
assert data_block2 == repaired_data_block2
#Datenblock 2 und Fehlererkennungscode:Stellen Sie 3 zu 1 wieder her
repaired_data_block1, _ = zfec.Decoder(2, 3).decode([data_block2, data_block3, ], [1, 2])
assert data_block1 == repaired_data_block1
5DataBlock
# -*- coding: utf-8 -*-
from __future__ import absolute_import, unicode_literals
import zfec
#Fehlererkennungskorrektur
data_block1 = str('aiueo')
data_block2 = str('kakik')
data_block3 = str('ukeko')
data_block4 = str('sasis')
data_block5 = str('useso')
#Fehlererkennungscode aus den Datenblöcken 1 und 2:Generieren Sie 3
blocks = zfec.Encoder(5, 6).encode([data_block1,
data_block2,
data_block3,
data_block4,
data_block5])
ecc_block = blocks[-1]
print str('ecc block is... {}').format(ecc_block)
# >>> ecc block is... J?\j
#Datenblock 1-Stellen Sie 5 von 4 und ECC-Blöcken wieder her
repaired_blocks = zfec.Decoder(5, 6).decode([data_block1,
data_block2,
data_block3,
data_block4,
ecc_block], [0, 1, 2, 3, 5])
assert data_block5 == repaired_blocks[4]
#Datenblock 1,2,4,Stellen Sie 3 von 5 und ECC-Block wieder her
repaired_blocks = zfec.Decoder(5, 6).decode([data_block1,
data_block2,
data_block4,
data_block5,
ecc_block], [0, 1, 3, 4, 5])
assert data_block3 == repaired_blocks[2]