[关闭]
@veightz 2014-11-05T11:36:24.000000Z 字数 3954 阅读 1842

计算机网络第一次实验报告


姓名 : 周思立
学号 : 12081333
上课时间 : 周三晚

说明

由于奇偶校验是一种特殊的CRC, 即CRC1,

x2+1

所以我一起处理了.

代码

  1. //
  2. // main.cpp
  3. // CrcCheck
  4. //
  5. // Created by Veight Zhou on 10/29/14.
  6. // Copyright (c) 2014 Veight Zhou. All rights reserved.
  7. //
  8. #include <iostream>
  9. #include <bitset>
  10. enum CRCType {CRC1, CRC4, CRC16, CRC32};
  11. unsigned long leftMove(CRCType type) {
  12. switch (type) {
  13. case CRC1:
  14. return 1;
  15. break;
  16. case CRC4:
  17. return 4;
  18. break;
  19. case CRC16:
  20. return 16;
  21. break;
  22. case CRC32:
  23. return 32;
  24. default:
  25. return 0;
  26. break;
  27. }
  28. }
  29. unsigned long generalPolynomial(CRCType type) {
  30. switch (type) {
  31. case CRC1:
  32. return 0x2;
  33. case CRC4:
  34. return 0x13;
  35. break;
  36. case CRC16:
  37. return 0x18005;
  38. break;
  39. case CRC32:
  40. return 0x104800007;
  41. break;
  42. default:
  43. break;
  44. }
  45. }
  46. /**
  47. * 自用转成二进制输出
  48. *
  49. * @param value 输出值
  50. */
  51. void log(unsigned long value) {
  52. std::cout << std::bitset<sizeof(unsigned long)*8>(value) << std::endl;
  53. }
  54. /**
  55. * 寻找1出现的最高位
  56. *
  57. * @param crc 现在的冗余值
  58. *
  59. * @return 返回位数
  60. */
  61. unsigned long leftOffset(unsigned long crc) {
  62. unsigned long length = sizeof(unsigned long)*8;
  63. for (unsigned long i = length - 1; i < length; i--) {
  64. unsigned long key = crc >> i;
  65. if (key == 0x01) { return i;}
  66. }
  67. return 0;
  68. }
  69. /**
  70. * 生成CRC
  71. *
  72. * @param originValue 原值
  73. * @param type CRC类型
  74. *
  75. * @return 返回拼接后的编码值
  76. */
  77. unsigned long generalCRC(unsigned long originValue, CRCType type) {
  78. // 原编码移位
  79. originValue = originValue << leftMove(type);
  80. unsigned long CRCValue = originValue;
  81. // 获取表达式
  82. unsigned long polynomial = generalPolynomial(type);
  83. unsigned long offset;
  84. while ( (offset = leftOffset(CRCValue)) >= leftMove(type) ) {
  85. // log(CRCValue);
  86. // log(polynomial << (offset - (unsigned long)leftMove(type)));
  87. CRCValue = CRCValue ^ (polynomial << (offset - (unsigned long)leftMove(type)));
  88. // log(CRCValue);
  89. // std::cout << std::endl;
  90. }
  91. std::cout << "冗余码计算结果:" << std::endl;
  92. log(CRCValue);
  93. std::cout << "待添加的编码:" << std::endl;
  94. log(originValue);
  95. originValue = originValue | CRCValue;
  96. std::cout << "生成码计算结果:" << std::endl;
  97. log(originValue);
  98. std::cout << "Over" << std::endl << std::endl;
  99. return originValue;
  100. }
  101. /**
  102. * 检查CRC
  103. *
  104. * @param receivedValue 接受的值
  105. * @param type CRC类型
  106. *
  107. * @return 返回判断结果
  108. */
  109. bool checkCRC(unsigned long receivedValue, CRCType type) {
  110. // 用户匹配出生成的冗余值的掩码
  111. // unsigned long maskValue = (0x1 << leftMove(type)) - 1;
  112. // 提取的冗余值
  113. // unsigned long checkValue = receivedValue & maskValue ;
  114. // log(checkValue);
  115. /**
  116. * 貌似上面这两货算出来也没什么用诶+_+ 真是醉了
  117. */
  118. // 获取表达式
  119. unsigned long polynomial = generalPolynomial(type);
  120. unsigned long offset;
  121. while ( (offset = leftOffset(receivedValue)) >= leftMove(type) ) {
  122. // log(receivedValue);
  123. // log(polynomial << (offset - (unsigned long)leftMove(type)));
  124. receivedValue = receivedValue ^ (polynomial << (offset - (unsigned long)leftMove(type)));
  125. // log(receivedValue);
  126. // std::cout << std::endl;
  127. }
  128. if (receivedValue == 0x0) {
  129. return true;
  130. }
  131. return false;
  132. }
  133. /**
  134. * 用于随机翻转几位可怜的编码
  135. *
  136. * @param thePoorvalue 待破坏的值
  137. * @param type CRC类型
  138. * @param fuckTimes 破坏的位数
  139. *
  140. * @return 翻转后的值
  141. */
  142. unsigned long randomDestory(unsigned long thePoorvalue, CRCType type, unsigned int fuckTimes) {
  143. unsigned long resultValue = thePoorvalue;
  144. srand((int)time(0));
  145. unsigned int changedPosition = rand() % 32;
  146. std::cout << "原值:\n";
  147. log(resultValue);
  148. for (int i = 0; i < fuckTimes; i++) {
  149. unsigned long maskValue = 0x1 << changedPosition;
  150. std::cout << "改变了倒数第" << changedPosition + 1 << "位\n";
  151. resultValue = resultValue ^ maskValue;
  152. log(resultValue);
  153. changedPosition = changedPosition * changedPosition % 32;
  154. }
  155. return resultValue;
  156. }
  157. int main(int argc, const char * argv[]) {
  158. unsigned long checkedValue;
  159. checkedValue = 0x123456790;
  160. CRCType valueCRCType = CRC4;
  161. std::cout << "第一次直接判断\n\n";
  162. unsigned long resultValue = generalCRC(checkedValue, valueCRCType);
  163. if (checkCRC(resultValue, valueCRCType)) {
  164. std::cout << "校验正确\n\n\n";
  165. } else {
  166. std::cout << "校验错误\n\n\n";
  167. }
  168. /**
  169. * 破坏一下下, 生成新的resultValue
  170. */
  171. std::cout << "进行破坏\n";
  172. resultValue = randomDestory(checkedValue, valueCRCType, 2);
  173. /**
  174. * 再次检查
  175. */
  176. std::cout << "第二次判断\n\n";
  177. if (checkCRC(resultValue, valueCRCType)) {
  178. std::cout << "校验正确\n\n\n";
  179. } else {
  180. std::cout << "校验错误\n\n\n";
  181. }
  182. // generalCRC(0x1234, CRC16);
  183. return 0;
  184. }

结果

第一次直接判断

冗余码计算结果:
0000000000000000000000000000000000000000000000000000000000001111
待添加的编码:
0000000000000000000000000001001000110100010101100111100100000000
生成码计算结果:
0000000000000000000000000001001000110100010101100111100100001111
Over

校验正确

进行破坏
原值:
0000000000000000000000000000000100100011010001010110011110010000
改变了倒数第6位
0000000000000000000000000000000100100011010001010110011110110000
改变了倒数第26位
0000000000000000000000000000000100100001010001010110011110110000
第二次判断

校验错误

Program ended with exit code: 0

添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注