当前位置:   article > 正文

RS_code 编码和解码_rs code

rs code

1. RS_Code是什么
        RS_Code是纠删码的一种。 
       Erasure Code(EC),即纠删码,是一种前向错误纠正技术(Forward Error Correction,FEC),主要应用在网络传输中避免包的丢失, 存储系统利用它来提高 存储 可靠性。相比多副本复制而言, 纠删码能够以更小的数据冗余度获得更高数据可靠性, 但编码方式较复杂,需要大量计算 。纠删码只能容忍数据丢失,无法容忍数据篡改,纠删码正是得名与此。
      Erasure Code是一种编码技术,它可以将n份原始数据,增加m份数据,并能通过n+m份中的任意n份数据,还原为原始数据。即如果有任意小于等于m份的数据失效,仍然能通过剩下的数据还原出来。
      目前,纠删码技术在分布式存储 系统中的应用主要有三类,阵列纠删码(Array Code: RAID5、RAID6等)、RS(Reed-Solomon)里德-所罗门类纠删码和LDPC(LowDensity Parity Check Code)低密度奇偶校验纠删码。
2. RS_Code库

  1. INCLUDEPATH += $$PWD/../depends/rscode/include
  2. Debug:{
  3. LIBS += -L$$PWD/../depends/rscode/lib/x64/Debug -lrscode
  4. }
  5. Release:{
  6. LIBS += -L$$PWD/../depends/rscode/lib/x64/Release -lrscode
  7. }


3. RS_Code的使用

  1. QByteArray origMsg = QByteArray::fromHex( "09 0c 09 0a 0c 0a 0b 0f 0c 0c 10 0c 0d 0d 10 11 0f 15 08 15 11 0b 0d 00 0c 00");
  2. qDebug() << "mac = " << mac << "before, origMsg = " << origMsg.toHex();
  3. QByteArray inbandMsg = ConvertOrigMsgToInbandMsg(origMsg);
  4. qDebug() << "mac = " << mac << "before, inbandMsg = " << inbandMsg.toHex();
  5. QList<int> lostFlag;
  6. lostFlag.clear();
  7. for (int i = 0; i< 26-3;i++)
  8. {
  9. lostFlag << (0);
  10. }
  11. lostFlag << (1);
  12. lostFlag << (0);
  13. lostFlag << (1);
  14. QVector<qint32> erasure = GetRSCodeErasure(lostFlag);
  15. RSCode::getInstance().Decode(inbandMsg, erasure);
  16. qDebug() << "mac = " << mac << "after, inbandMsg = " << inbandMsg.toHex();
  17. origMsg = InbandMsgToConvertOrigMsg(inbandMsg);
  18. qDebug() << "mac = " << mac << "after, origMsg = " << origMsg.toHex();

 

  1. QByteArray InbandMsg::ConvertOrigMsgToInbandMsg(QByteArray &origMsg)
  2. {
  3. QByteArray inbandMsg;
  4. //未拼接的原始消息长度必须是2的倍数(原始消息每次传4bit)
  5. if ((origMsg.size() % 2) != 0)
  6. {
  7. return inbandMsg;
  8. }
  9. int inbandMsgSize = origMsg.size() / 2;
  10. int high4Bit;
  11. int low4Bit;
  12. int byteValue;
  13. for (int i = 0; i < inbandMsgSize; i++)
  14. {
  15. high4Bit = (origMsg[2*i] - ORIG_MSG_CONTENT_BEGINE) & 0x0f;
  16. low4Bit = (origMsg[2*i + 1] - ORIG_MSG_CONTENT_BEGINE) & 0x0f;
  17. byteValue = (high4Bit << 4) + low4Bit;
  18. inbandMsg += static_cast<char>(byteValue);
  19. }
  20. return inbandMsg;
  21. }
  22. QByteArray InbandMsg::InbandMsgToConvertOrigMsg(QByteArray &inbandMsg)
  23. {
  24. QByteArray origMsg;
  25. int high4Bit;
  26. int low4Bit;
  27. for (int i = 0; i < inbandMsg.size(); i++)
  28. {
  29. high4Bit = (inbandMsg.at(i) & 0xf0) >> 4;
  30. origMsg+= static_cast<char>(high4Bit);
  31. low4Bit = inbandMsg.at(i) & 0x0f;
  32. origMsg+= static_cast<char>(low4Bit);
  33. }
  34. return origMsg;
  35. }


4. 参考文献
Erasure Code - EC纠删码原理     https://blog.csdn.net/shelldon/article/details/54144730
 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/繁依Fanyi0/article/detail/408060
推荐阅读
相关标签
  

闽ICP备14008679号