qt c++ 大小端字节序数据获取与转换

  • 按照约定的大小端顺序,在数组中取出指定数据,并转为指令的大小端字节序的一些方法

qint8 extractqInt8(const QByteArray &byteArray, int startPos)
{
    // 检查起始位置和数据是否足够
    if (startPos >= byteArray.size()) {
        qWarning() << "Invalid start position or insufficient data.";
        return 0;
    }

    // 从 QByteArray 中提取数据
    const char *data = byteArray.constData() + startPos;

    // 提取数据并进行符号扩展
    qint8 value = static_cast<qint8>(data[0]);

    return value;
}

quint8 extractqUint8(const QByteArray &byteArray, int startPos)
{
    // 检查起始位置和数据是否足够
    if (startPos >= byteArray.size()) {
        qWarning() << "Invalid start position or insufficient data.";
        return 0;
    }
    // 从 QByteArray 中提取数据
    const char *data = byteArray.constData() + startPos;
    // 提取数据并进行符号扩展
    quint8 value = static_cast<quint8>(data[0]);
    return value;
}

/**************** 输入数据为大端字节序 ****************/
// 提取小端字节序的 quint16 值
quint16 extractqUint16_BE2LE(const QByteArray &byteArray, int startPos)
{
    if (startPos + 2 > byteArray.size()) {
        qWarning() << "Invalid start position or insufficient data.";
        return 0;
    }

    const uchar *data = reinterpret_cast<const uchar *>(byteArray.constData() + startPos);
    quint16 value = static_cast<quint16>(data[1])
                    | (static_cast<quint16>(data[0]) << 8);
    return value;
}

// 提取小端字节序的 quint32 值
quint32 extractqUint32_BE2LE(const QByteArray &byteArray, int startPos)
{
    if (startPos + 4 > byteArray.size()) {
        qWarning() << "Invalid start position or insufficient data.";
        return 0;
    }

    const uchar *data = reinterpret_cast<const uchar *>(byteArray.constData() + startPos);
    quint32 value = static_cast<quint32>(data[3])
                    | (static_cast<quint32>(data[2]) << 8)
                    | (static_cast<quint32>(data[1]) << 16)
                    | (static_cast<quint32>(data[0]) << 24);
    return value;
}

// 提取小端字节序的 quint64 值
quint64 extractqUint64_BE2LE(const QByteArray &byteArray, int startPos)
{
    if (startPos + 8 > byteArray.size()) {
        qWarning() << "Invalid start position or insufficient data.";
        return 0;
    }

    const uchar *data = reinterpret_cast<const uchar *>(byteArray.constData() + startPos);
    quint64 value = static_cast<quint64>(data[7])
                    | (static_cast<quint64>(data[6]) << 8)
                    | (static_cast<quint64>(data[5]) << 16)
                    | (static_cast<quint64>(data[4]) << 24)
                    | (static_cast<quint64>(data[3]) << 32)
                    | (static_cast<quint64>(data[2]) << 40)
                    | (static_cast<quint64>(data[1]) << 48)
                    | (static_cast<quint64>(data[0]) << 56);
    return value;
}

// 提取小端字节序的 qint16 值
qint16 extractqInt16_BE2LE(const QByteArray &byteArray, int startPos)
{
    if (startPos + 2 > byteArray.size()) {
        qWarning() << "Invalid start position or insufficient data.";
        return 0;
    }

    const uchar *data = reinterpret_cast<const uchar *>(byteArray.constData() + startPos);
    qint16 value = static_cast<qint16>(data[1])
                   | (static_cast<qint16>(data[0]) << 8);
    return value;
}

// 提取小端字节序的 qint32 值
qint32 extractqInt32_BE2LE(const QByteArray &byteArray, int startPos)
{
    if (startPos + 4 > byteArray.size()) {
        qWarning() << "Invalid start position or insufficient data.";
        return 0;
    }

    const uchar *data = reinterpret_cast<const uchar *>(byteArray.constData() + startPos);
    qint32 value = static_cast<qint32>(data[3])
                   | (static_cast<qint32>(data[2]) << 8)
                   | (static_cast<qint32>(data[1]) << 16)
                   | (static_cast<qint32>(data[0]) << 24);
    return value;
}

// 提取小端字节序的 qint64 值
qint64 extractqInt64_BE2LE(const QByteArray &byteArray, int startPos)
{
    if (startPos + 8 > byteArray.size()) {
        qWarning() << "Invalid start position or insufficient data.";
        return 0;
    }

    const uchar *data = reinterpret_cast<const uchar *>(byteArray.constData() + startPos);
    qint64 value = static_cast<qint64>(data[7])
                   | (static_cast<qint64>(data[6]) << 8)
                   | (static_cast<qint64>(data[5]) << 16)
                   | (static_cast<qint64>(data[4]) << 24)
                   | (static_cast<qint64>(data[3]) << 32)
                   | (static_cast<qint64>(data[2]) << 40)
                   | (static_cast<qint64>(data[1]) << 48)
                   | (static_cast<qint64>(data[0]) << 56);
    return value;
}

/**************** 输入小端字节序数据 ****************/
// 提取小端字节序的 quint16 值
quint16 extractqUint16_LE2LE(const QByteArray &byteArray, int startPos)
{
    if (startPos + 2 > byteArray.size()) {
        qWarning() << "Invalid start position or insufficient data.";
        return 0;
    }

    // 从 QByteArray 中提取数据
    quint16 littleEndianValue;
    std::memcpy(&littleEndianValue, byteArray.constData() + startPos, sizeof(quint16));

    return littleEndianValue;
}

// 提取小端字节序的 quint32 值
quint32 extractqUint32_LE2LE(const QByteArray &byteArray, int startPos)
{
    if (startPos + 4 > byteArray.size()) {
        qWarning() << "Invalid start position or insufficient data.";
        return 0;
    }

    //    const uchar *data = reinterpret_cast<const uchar *>(byteArray.constData() + startPos);
    //    quint32 littleEndianValue = static_cast<quint32>(data[0])
    //                                | (static_cast<quint32>(data[1]) << 8)
    //                                | (static_cast<quint32>(data[2]) << 16)
    //                                | (static_cast<quint32>(data[3]) << 24);
    quint32 littleEndianValue;
    std::memcpy(&littleEndianValue, byteArray.constData() + startPos, sizeof(quint32));
    return littleEndianValue;
}

// 提取小端字节序的 quint64 值
quint64 extractqUint64_LE2LE(const QByteArray &byteArray, int startPos)
{
    // 检查起始位置和数据是否足够
    if (startPos + 8 > byteArray.size()) {
        qWarning() << "Invalid start position or insufficient data.";
        return 0;
    }

    // 从 QByteArray 中提取数据
    quint64 littleEndianValue;
    std::memcpy(&littleEndianValue, byteArray.constData() + startPos, sizeof(quint64));
    return littleEndianValue;
}

// 提取小端字节序的 qint16 值
qint16 extractqInt16_LE2LE(const QByteArray &byteArray, int startPos)
{
    if (startPos + 2 > byteArray.size()) {
        qWarning() << "Invalid start position or insufficient data.";
        return 0;
    }

    // 从 QByteArray 中提取数据
    qint16 littleEndianValue;
    std::memcpy(&littleEndianValue, byteArray.constData() + startPos, sizeof(qint16));

    return littleEndianValue;
}

// 提取小端字节序的 qint32 值
qint32 extractqInt32_LE2LE(const QByteArray &byteArray, int startPos)
{
    if (startPos + 4 > byteArray.size()) {
        qWarning() << "Invalid start position or insufficient data.";
        return 0;
    }

    qint32 littleEndianValue;
    std::memcpy(&littleEndianValue, byteArray.constData() + startPos, sizeof(qint32));

    return littleEndianValue;
}

// 提取小端字节序的 qint64 值
qint64 extractqInt64_LE2LE(const QByteArray &byteArray, int startPos)
{
    if (startPos + 8 > byteArray.size()) {
        qWarning() << "Invalid start position or insufficient data.";
        return 0;
    }
    qint64 littleEndianValue;
    std::memcpy(&littleEndianValue, byteArray.constData() + startPos, sizeof(qint64));
    return littleEndianValue;
}

/************************ 以下为大端数据,转为大端数据 *******************/
//x86架构默认为小端存储,所以以下方法在x86平台使用时,注意
// 提取大端字节序的 quint16 值
quint16 extractqUint16_BE2BE(const QByteArray &byteArray, int startPos)
{
    if (startPos + 2 > byteArray.size()) {
        qWarning() << "Invalid start position or insufficient data.";
        return 0;
    }

    // 从 QByteArray 中提取数据
    const uchar *data = reinterpret_cast<const uchar *>(byteArray.constData() + startPos);
    quint16 littleEndianValue = static_cast<quint16>(data[1])
                                | (static_cast<quint16>(data[0]) << 8);
    // 将小端字节序转换为大端字节序
    quint16 bigEndianValue = (littleEndianValue >> 8)
                             | (littleEndianValue << 8);
    return bigEndianValue;
}
// 提取大端字节序的 quint32 值
quint32 extractqUint32_BE2BE(const QByteArray &byteArray, int startPos)
{
    if (startPos + 4 > byteArray.size()) {
        qWarning() << "Invalid start position or insufficient data.";
        return 0;
    }

    const uchar *data = reinterpret_cast<const uchar *>(byteArray.constData() + startPos);
    quint32 littleEndianValue = static_cast<quint32>(data[3])
                                | (static_cast<quint32>(data[2]) << 8)
                                | (static_cast<quint32>(data[1]) << 16)
                                | (static_cast<quint32>(data[0]) << 24);

    // 将小端字节序转换为大端字节序
    quint32 bigEndianValue = ((littleEndianValue & 0x000000FF) << 24)
                             | ((littleEndianValue & 0x0000FF00) << 8)
                             | ((littleEndianValue & 0x00FF0000) >> 8)
                             | ((littleEndianValue & 0xFF000000) >> 24);

    return bigEndianValue;
}

// 提取大端字节序的 quint64 值
quint64 extractqUint64_BE2BE(const QByteArray &byteArray, int startPos)
{
    // 检查起始位置和数据是否足够
    if (startPos + 8 > byteArray.size()) {
        qWarning() << "Invalid start position or insufficient data.";
        return 0;
    }

    // 从 QByteArray 中提取数据
    const uchar *data = reinterpret_cast<const uchar *>(byteArray.constData() + startPos);
    quint64 littleEndianValue = static_cast<quint64>(data[7])
                                | (static_cast<quint64>(data[6]) << 8)
                                | (static_cast<quint64>(data[5]) << 16)
                                | (static_cast<quint64>(data[4]) << 24)
                                | (static_cast<quint64>(data[3]) << 32)
                                | (static_cast<quint64>(data[2]) << 40)
                                | (static_cast<quint64>(data[1]) << 48)
                                | (static_cast<quint64>(data[0]) << 56);

    // 将小端字节序转换为大端字节序
    quint64 bigEndianValue = ((littleEndianValue & 0x00000000000000FFULL) << 56)
                             | ((littleEndianValue & 0x000000000000FF00ULL) << 40)
                             | ((littleEndianValue & 0x0000000000FF0000ULL) << 24)
                             | ((littleEndianValue & 0x00000000FF000000ULL) << 8)
                             | ((littleEndianValue & 0x000000FF00000000ULL) >> 8)
                             | ((littleEndianValue & 0x0000FF0000000000ULL) >> 24)
                             | ((littleEndianValue & 0x00FF000000000000ULL) >> 40)
                             | ((littleEndianValue & 0xFF00000000000000ULL) >> 56);

    return bigEndianValue;
}
// 提取大端字节序的 qint16 值
qint16 extractqInt16_BE2BE(const QByteArray &byteArray, int startPos)
{
    if (startPos + 2 > byteArray.size()) {
        qWarning() << "Invalid start position or insufficient data.";
        return 0;
    }

    // 从 QByteArray 中提取数据
    const uchar *data = reinterpret_cast<const uchar *>(byteArray.constData() + startPos);
    qint16 littleEndianValue = static_cast<qint16>(data[1])
                               | (static_cast<qint16>(data[0]) << 8);
    // 将小端字节序转换为大端字节序
    qint16 bigEndianValue = (littleEndianValue >> 8)
                            | (littleEndianValue << 8);
    return bigEndianValue;
}
// 提取大端字节序的 qint32 值
qint32 extractqInt32_BE2BE(const QByteArray &byteArray, int startPos)
{
    if (startPos + 4 > byteArray.size()) {
        qWarning() << "Invalid start position or insufficient data.";
        return 0;
    }

    const uchar *data = reinterpret_cast<const uchar *>(byteArray.constData() + startPos);
    qint32 littleEndianValue = static_cast<qint32>(data[3])
                               | (static_cast<qint32>(data[2]) << 8)
                               | (static_cast<qint32>(data[1]) << 16)
                               | (static_cast<qint32>(data[0]) << 24);

    // 将小端字节序转换为大端字节序
    qint32 bigEndianValue = ((littleEndianValue & 0x000000FF) << 24)
                            | ((littleEndianValue & 0x0000FF00) << 8)
                            | ((littleEndianValue & 0x00FF0000) >> 8)
                            | ((littleEndianValue & 0xFF000000) >> 24);

    return bigEndianValue;
}

// 提取大端字节序的 qint64 值
qint64 extractqInt64_BE2BE(const QByteArray &byteArray, int startPos)
{
    // 从 QByteArray 中提取数据
    const uchar *data = reinterpret_cast<const uchar *>(byteArray.constData() + startPos);

    // 提取数据并进行符号扩展
    qint64 littleEndianValue = static_cast<qint64>(data[7])
                               | (static_cast<qint64>(data[6]) << 8)
                               | (static_cast<qint64>(data[5]) << 16)
                               | (static_cast<qint64>(data[4]) << 24)
                               | (static_cast<qint64>(data[3]) << 32)
                               | (static_cast<qint64>(data[2]) << 40)
                               | (static_cast<qint64>(data[1]) << 48)
                               | (static_cast<qint64>(data[0]) << 56);
    // 将小端字节序转换为大端字节序
    qint64 bigEndianValue = ((littleEndianValue & 0x00000000000000FFULL) << 56)
                            | ((littleEndianValue & 0x000000000000FF00ULL) << 40)
                            | ((littleEndianValue & 0x0000000000FF0000ULL) << 24)
                            | ((littleEndianValue & 0x00000000FF000000ULL) << 8)
                            | ((littleEndianValue & 0x000000FF00000000ULL) >> 8)
                            | ((littleEndianValue & 0x0000FF0000000000ULL) >> 24)
                            | ((littleEndianValue & 0x00FF000000000000ULL) >> 40)
                            | ((littleEndianValue & 0xFF00000000000000ULL) >> 56);

    return bigEndianValue;
}

/************************ 以下为小端数据,转为大端数据 *******************/
//x86架构默认为小端存储,所以以下方法在x86平台使用时,注意
// 提取大端字节序的 quint16 值
quint16 extractqUint16_LE2BE(const QByteArray &byteArray, int startPos)
{
    if (startPos + 2 > byteArray.size()) {
        qWarning() << "Invalid start position or insufficient data.";
        return 0;
    }

    // 从 QByteArray 中提取数据
    const uchar *data = reinterpret_cast<const uchar *>(byteArray.constData() + startPos);
    quint16 littleEndianValue = static_cast<quint16>(data[0])
                                | (static_cast<quint16>(data[1]) << 8);

    // 将小端字节序转换为大端字节序
    quint16 bigEndianValue = (littleEndianValue >> 8)
                             | (littleEndianValue << 8);
    return bigEndianValue;
}

// 提取大端字节序的 quint32 值
quint32 extractqUint32_LE2BE(const QByteArray &byteArray, int startPos)
{
    if (startPos + 4 > byteArray.size()) {
        qWarning() << "Invalid start position or insufficient data.";
        return 0;
    }

    const uchar *data = reinterpret_cast<const uchar *>(byteArray.constData() + startPos);
    quint32 littleEndianValue = static_cast<quint32>(data[0])
                                | (static_cast<quint32>(data[1]) << 8)
                                | (static_cast<quint32>(data[2]) << 16)
                                | (static_cast<quint32>(data[3]) << 24);

    // 将小端字节序转换为大端字节序
    quint32 bigEndianValue = ((littleEndianValue & 0x000000FF) << 24)
                             | ((littleEndianValue & 0x0000FF00) << 8)
                             | ((littleEndianValue & 0x00FF0000) >> 8)
                             | ((littleEndianValue & 0xFF000000) >> 24);

    return bigEndianValue;
}

// 提取大端字节序的 quint64 值
quint64 extractqUint64_LE2BE(const QByteArray &byteArray, int startPos)
{
    // 检查起始位置和数据是否足够
    if (startPos + 8 > byteArray.size()) {
        qWarning() << "Invalid start position or insufficient data.";
        return 0;
    }

    // 从 QByteArray 中提取数据
    const uchar *data = reinterpret_cast<const uchar *>(byteArray.constData() + startPos);
    quint64 littleEndianValue = static_cast<quint64>(data[0])
                                | (static_cast<quint64>(data[1]) << 8)
                                | (static_cast<quint64>(data[2]) << 16)
                                | (static_cast<quint64>(data[3]) << 24)
                                | (static_cast<quint64>(data[4]) << 32)
                                | (static_cast<quint64>(data[5]) << 40)
                                | (static_cast<quint64>(data[6]) << 48)
                                | (static_cast<quint64>(data[7]) << 56);

    // 将小端字节序转换为大端字节序
    quint64 bigEndianValue = ((littleEndianValue & 0x00000000000000FFULL) << 56)
                             | ((littleEndianValue & 0x000000000000FF00ULL) << 40)
                             | ((littleEndianValue & 0x0000000000FF0000ULL) << 24)
                             | ((littleEndianValue & 0x00000000FF000000ULL) << 8)
                             | ((littleEndianValue & 0x000000FF00000000ULL) >> 8)
                             | ((littleEndianValue & 0x0000FF0000000000ULL) >> 24)
                             | ((littleEndianValue & 0x00FF000000000000ULL) >> 40)
                             | ((littleEndianValue & 0xFF00000000000000ULL) >> 56);

    return bigEndianValue;
}

// 提取大端字节序的 qint16 值
qint16 extractqInt16_LE2BE(const QByteArray &byteArray, int startPos)
{
    if (startPos + 2 > byteArray.size()) {
        qWarning() << "Invalid start position or insufficient data.";
        return 0;
    }

    // 从 QByteArray 中提取数据
    const uchar *data = reinterpret_cast<const uchar *>(byteArray.constData() + startPos);
    qint16 littleEndianValue = static_cast<qint16>(data[0])
                               | (static_cast<qint16>(data[1]) << 8);

    // 将小端字节序转换为大端字节序
    qint16 bigEndianValue = (littleEndianValue >> 8)
                            | (littleEndianValue << 8);
    return bigEndianValue;
}
// 提取大端字节序的 qint32 值
qint32 extractqInt32_LE2BE(const QByteArray &byteArray, int startPos)
{
    if (startPos + 4 > byteArray.size()) {
        qWarning() << "Invalid start position or insufficient data.";
        return 0;
    }

    const uchar *data = reinterpret_cast<const uchar *>(byteArray.constData() + startPos);
    qint32 littleEndianValue = static_cast<qint32>(data[0])
                               | (static_cast<qint32>(data[1]) << 8)
                               | (static_cast<qint32>(data[2]) << 16)
                               | (static_cast<qint32>(data[3]) << 24);

    // 将小端字节序转换为大端字节序
    qint32 bigEndianValue = ((littleEndianValue & 0x000000FF) << 24)
                            | ((littleEndianValue & 0x0000FF00) << 8)
                            | ((littleEndianValue & 0x00FF0000) >> 8)
                            | ((littleEndianValue & 0xFF000000) >> 24);

    return bigEndianValue;
}

// 提取大端字节序的 qint64 值
qint64 extractqInt64_LE2BE(const QByteArray &byteArray, int startPos)
{
    // 从 QByteArray 中提取数据
    const uchar *data = reinterpret_cast<const uchar *>(byteArray.constData() + startPos);

    qint64 littleEndianValue = static_cast<qint64>(data[0])
                               | (static_cast<qint64>(data[1]) << 8)
                               | (static_cast<qint64>(data[2]) << 16)
                               | (static_cast<qint64>(data[3]) << 24)
                               | (static_cast<qint64>(data[4]) << 32)
                               | (static_cast<qint64>(data[5]) << 40)
                               | (static_cast<qint64>(data[6]) << 48)
                               | (static_cast<qint64>(data[7]) << 56);

    // 将小端字节序转换为大端字节序
    qint64 bigEndianValue = ((littleEndianValue & 0x00000000000000FFULL) << 56)
                            | ((littleEndianValue & 0x000000000000FF00ULL) << 40)
                            | ((littleEndianValue & 0x0000000000FF0000ULL) << 24)
                            | ((littleEndianValue & 0x00000000FF000000ULL) << 8)
                            | ((littleEndianValue & 0x000000FF00000000ULL) >> 8)
                            | ((littleEndianValue & 0x0000FF0000000000ULL) >> 24)
                            | ((littleEndianValue & 0x00FF000000000000ULL) >> 40)
                            | ((littleEndianValue & 0xFF00000000000000ULL) >> 56);

    return bigEndianValue;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值