pqutilsfunc.h 1.8 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667
  1. #ifndef PQ_UTILS_FUNC_H
  2. #define PQ_UTILS_FUNC_H
  3. #include <QByteArray>
  4. #include <QBitArray>
  5. /***
  6. * 通讯处理的公共函数
  7. */
  8. namespace PQ {
  9. /// 代码和校验
  10. uchar daiMaHe(const QByteArray & ch, int len );
  11. /// CRC 校验
  12. ushort CRC(const QByteArray & ch,int len);
  13. /// LRC 校验
  14. uchar LRC(const QByteArray & ch,int len);
  15. /// BCC 异或校验和
  16. uchar XOR(const QByteArray & ch,int len);
  17. /// 反转 QByteArray
  18. QByteArray reverse(const QByteArray & ch);
  19. /// 获取 QByteArray 的每一位的值
  20. QBitArray getBits(const QByteArray & ch);
  21. /// 把 QBitArray 转换为字节数组
  22. QByteArray toBytes(const QBitArray & bits);
  23. /// 分割BIT数组
  24. QBitArray midBitArray(const QBitArray & array,int start, int lenght = -1);
  25. ///把 ASCII转化为对应的整数值
  26. uint AsciitoInt(const uchar Byte);
  27. ///MurmurHash3 算法 算string hash值
  28. quint32 hashString(const QString & hash);
  29. /// 数字和 QbyteArray转换
  30. template<typename T>
  31. QByteArray number2ByteArray(T v){
  32. int size = sizeof(T);
  33. char * ch = reinterpret_cast<char *>(&v);
  34. return QByteArray(ch,size);
  35. }
  36. template<typename T>
  37. T byteArray2number(QByteArray & ary){
  38. if(ary.isEmpty()) return 0;
  39. switch(ary.size()){
  40. case 2:
  41. {
  42. ushort rv = 0;
  43. memcpy(&rv,ary.data(),2);
  44. return static_cast<T>(rv);
  45. }
  46. case 4:
  47. {
  48. uint rv = 0;
  49. memcpy(&rv,ary.data(),4);
  50. return static_cast<T>(rv);
  51. }
  52. case 8: {
  53. qint64 rv = 0;
  54. memcpy(&rv,ary.data(),8);
  55. return static_cast<T>(rv);
  56. }
  57. }
  58. return static_cast<T>(ary.at(0));
  59. }
  60. }
  61. #endif // DATAPACK_H