• QT中的字符串的各种处理


    QT中的字符串的各种处理

    16进制字符串转QByteArray

    QByteArray HexStringToByteArray(QString HexString)
    {
        bool ok;
        QByteArray ret;
        HexString = HexString.trimmed();
        HexString = HexString.simplified();
        QStringList sl;
        for(int i=0; i<HexString.length()/2; i++)
        {
            sl.append(HexString.mid(i*2, 2));
        }
    
    
        foreach (QString s, sl) {
            if(!s.isEmpty())
            {
                char c = s.toInt(&ok,16)&0xFF;
                if(ok){
                    ret.append(c);
                }else{
                    qDebug()<<QString::fromLocal8Bit("非法的16进制字符:")<<s;
                }
            }
        }
        qDebug()<<ret;
        return ret;
    }
    
        QByteArray baRsuData = HexStringToByteArray("FFFF58B40C120AFE01000000090000891700000000B9F3D6DDB8DFCBD91611520113282202000961892014112420441124B9F3414B44313538000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001350000000000000000000000000000000000010000000000AA290014514407A15D42BCFE00010300000000000000000067DE7901B9F3414B443135380000000015000000C1FF");
    

    QByteArray 转16进制字符串

    QString(baRecv.toHex().toUpper())
    

     大端小端字节序互转

    定义变量 unsigned long long a=0x1122334455667788

    变量a是一个64位的无符号整数,共需要8个字节来存储,那么在两种模式下是如何存储的呢?

    ||--1--||--2--||--3--||--4--||--5--||--6--||--7--||--8--||  地址

    ||  11 ||  22 ||  33 ||  44 ||  55 ||  66 ||  77 ||  88 ||  大端模式

    ||  88 ||  77 ||  66 ||  55 ||  44 ||  33 ||  22 ||  11 ||  小端模式


    在我们日常使用的x86架构的计算机中(其他类别的可能会采用大端模式或可配置模式,可以通过查阅资料或者用下文的代码进行测试),都是使用的小端模式,而网络字节序是大端模式的。

    文件存储中的模式

    文件的存储一般都是以字节来进行操作的,因此,在文件中以什么样的字节序需要程序的编写者加以注意。比方说下面的程序:

       int a=0x11223344;
        FILE *fp;
        fp=fopen("test","wb");
        fwrite(&a,sizeof(a),1,fp);
        fclose(fp);
    

     用十六进制编辑器打开文件之后,我们会发现文件的内容是44332211。原因很简单,fwrite函数直接把内存中的内容按顺序写入了文件,因此内存中是小端模式存储的,所以写入文件也是小端模式。

    优缺点

    大端模式,由于符号位和数值的高位存在地址的低位,会优先被读到,更容易先确定数据的重要信息。

    小端模式,在进行类型转换的时候不需要调整数据。如int强制转换到char,计算机不需要做任何调整,直接读取int的第一个字节即可。

    Qt中大端小端的转换

    Qt中<QtEndian>包含了大端小端转换的几个函数

    T	qFromBigEndian(const uchar * src)
    T	qFromBigEndian(T src)
    T	qFromLittleEndian(const uchar * src)
    T	qFromLittleEndian(T src)
    void	qToBigEndian(T src, uchar * dest)
    T	qToBigEndian(T src)
    void	qToLittleEndian(T src, uchar * dest)
    T	qToLittleEndian(T src)
    

     下面对几个函数进行说明

    union{
            int a;
            char b[4];
    }test1,test2;
    test1.a=0x61626364;
    test2.a=qFromBigEndian(test1.a);
    qDebug()<<test1.b[0]<<test1.b[1]<<test1.b[2]<<test1.b[3];
    qDebug()<<test2.b[0]<<test2.b[1]<<test2.b[2]<<test2.b[3];
    

     对于qFromBigEndian()函数,它会判断执行程序的主机的字节序,如果是大端模式的计算机,那么只是读取数据,不进行转换,如果是小端模式的计算机,那么则进行转换。
    因此我在本机(小端模式)上的的执行结果是:

    d c b a

    a b c d

    可以看出,它将数据进行了转换。
    对于qFromLittleEndian()函数,和前者类似。对于大端模式的计算机进行转换,对于小端模式的计算机只是读取数据。

    union{
            int a;
            char b[4];
    }test1,test2;
    test1.a=0x61626364;
    test2.a=qFromLittleEndian(test1.a);
    qToBigEndian(test1.a,(uchar*)test2.b);
    qDebug()<<test1.b[0]<<test1.b[1]<<test1.b[2]<<test1.b[3];
    qDebug()<<test2.b[0]<<test2.b[1]<<test2.b[2]<<test2.b[3];
    

     对于qToBigEndian()函数,也有着上面的规则,对于小端模式的计算机进行转换,对于大端模式的计算机只进行读取。
    因此,本机(小端模式)的执行结果是:

    d c b a

    a b c d

    对于qToLittleEndian()函数,只对大端模式的计算机进行转换。
    需要注意的是,Qt中的模板T只针对有符号和无符号的整型,对于浮点型(一般也不会用到),需要进行强制类型转换。
    原文:https://blog.csdn.net/usownh/article/details/42614185

  • 相关阅读:
    Codeforces Round #562 (Div. 2) B. Pairs
    Codeforces Round #562 (Div. 2) A.Circle Metro
    K.河北美食
    H.天神的密码
    国标GB28181协议智能分析告警平台EasyGBS及EasyCVR监控系统内iframe的常见问题说明
    【解决方案】国标GB28181平台EasyGBS级联EasyCVR视频智能分析搭建“蓝天卫士”网络视频监控系统技术方案
    【解决方案】基于国标GB28181协议/HIKSDK/Ehome协议EasyCVR智能融合分析平台在智慧校园人脸识别中的应用
    TSINGSEE青犀视频基于开源Webrtc服务器编译mediasoupClient运行报”SignalEncoderTimeOut, Encoder timed out”
    TSINGSEE青犀视频云边端H265播放器EasyPlayer-RTSP在C#版本增加OSD功能说明
    TSINGSEE青犀视频自主研发的H265播放器被集成后无法播放视频是什么原因?
  • 原文地址:https://www.cnblogs.com/huanyinglvtuan/p/11284627.html
Copyright © 2020-2023  润新知