#ifndef PQ_UTILS_FUNC_H
#define PQ_UTILS_FUNC_H

#include <QByteArray>
#include <QBitArray>
/***
 * 通讯处理的公共函数
*/

namespace PQ {
    /// 代码和校验
    uchar daiMaHe(const QByteArray & ch,  int len );
    /// CRC 校验
    ushort CRC(const QByteArray & ch,int len);
    /// LRC 校验
    uchar LRC(const QByteArray & ch,int len);
    /// BCC 异或校验和
    uchar XOR(const QByteArray & ch,int len);
    /// 反转 QByteArray
    QByteArray reverse(const QByteArray & ch);
    /// 获取 QByteArray 的每一位的值
    QBitArray getBits(const QByteArray & ch);
    /// 把 QBitArray 转换为字节数组
    QByteArray toBytes(const QBitArray & bits);
    /// 分割BIT数组
    QBitArray midBitArray(const QBitArray & array,int start, int lenght = -1);
    ///把 ASCII转化为对应的整数值
    uint AsciitoInt(const uchar Byte);
    ///MurmurHash3 算法 算string hash值
    quint32 hashString(const QString & hash);

    /// 数字和 QbyteArray转换
    template<typename T>
    QByteArray number2ByteArray(T v){
       int size = sizeof(T);
       char * ch = reinterpret_cast<char *>(&v);
       return QByteArray(ch,size);
    }

    template<typename T>
    T byteArray2number(QByteArray & ary){
        if(ary.isEmpty()) return 0;
            switch(ary.size()){
            case 2:
            {
                ushort rv = 0;
                memcpy(&rv,ary.data(),2);
                return  static_cast<T>(rv);
            }
            case 4:
            {
                uint rv = 0;
                memcpy(&rv,ary.data(),4);
                return  static_cast<T>(rv);
            }
            case 8: {
                qint64 rv = 0;
                memcpy(&rv,ary.data(),8);
                return  static_cast<T>(rv);
            }
        }
        return static_cast<T>(ary.at(0));
    }
}


#endif // DATAPACK_H
