Qt-cpp

数据类型

数值类型

  • qint8 1字节 -> char

  • qint16 2字节 -> short int

  • qint32 4字节 -> int

  • qintptr -> 用有符号整数表示指针的整数类型

  • quint8 -> unsigned char

  • quint16 -> unsigned short

  • quint32 -> unsigned int

  • uchar -> unsigned char

  • uint -> unsigned int

  • ushort -> unsigned short

  • 数据范围

#include <QDebug>
#include <limits>
qDebug()<<sizeof(qint8)<<" "<<sizeof(uchar);
qDebug()<<std::numeric_limits<qint8>::max();
qDebug()<<std::numeric_limits<qint8>::min();
/* 
    涉及函数模板、类模板、条件编译
*/
#include "widget.h"

#include <QApplication>
#include <limits>
#include <QDebug>

//using namespace std;

template <typename T>
void showRange(T *t)
{
    qDebug()<<typeid(T).name()<<"size:"<<sizeof(T)<<"max:"<<std::numeric_limits<T>::max()<<"min:"<<std::numeric_limits<T>::min();
}

template <typename T>
class Check
{
public:
    T m_t;
    Check();
};

template<typename T>
Check<T>::Check()
{
    qDebug()<<typeid(T).name()<<"size:"<<sizeof(T)<<"max:"<<std::numeric_limits<T>::max()<<"min:"<<std::numeric_limits<T>::min();
}

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    Widget w;
    w.show();
    
    #if 0
        qint32 i;
        showRange(&i);
    #else
        Check<qint8> uit1; // 调用构造函数
    #endif
        
    return a.exec();
}

QString

https://yujiang.blog.csdn.net/article/details/122403386
https://blog.csdn.net/qq_41802658/article/details/121490656

append() // 追加
push_back() // 追加
prepend() // 头部追加
insert() // 插入
aspritf() // 格式化
arg() // 格式化
number() // 转换数字 
setnumber() // 转换数字

choped() // 删除
clear() // 清空
remove() // 移除

indexOf() // 正向查找
lastindexOf() // 反向查找
contains() // 包含
startsWith() // 包含开头
count() // 统计

replace() // 替换
split() // 分割
section() // 分割后截取
mid() // 索引+长度截取
left() // 左截取
right() // 右截取
resize() // 裁剪
#include "widget.h"

#include <QApplication>
#include <QDebug>
#include <QString>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    Widget w;

    /* == 初始化 == */
    QString str1="init";
    qDebug()<<"str1:"<<str1; // str1: "init"

    /* == resize == */
    QString str2;
    str2.resize(1);
    str2[0]='0';
    qDebug()<<"str2:"<<str2; // str2: "0"

    QString str3="hello qt";
    str3.resize(5);
    qDebug()<<"str3:"<<str3; // str3: "hello"

    /* 拷贝构造 */
    QString str4(str3);
    qDebug()<<"str4:"<<str4; // str4: "hello"

    /* 单字符初始化 */
    QString str5(static_cast<QChar>(0x01)); // 整型转换为QChar
    qDebug()<<"str5:"<<str5; // str5: "\u0001"

    /*其他构造函数*/
    QChar p[5]={'1','1','1',static_cast<QChar>(0x34)};
    const char* pstr="test";
    QString str6(p,5); // 用Qchar构建
    QString str7(pstr);
    qDebug()<<"str6:"<<str6; // str6: "1114\u0000"
    qDebug()<<"str7:"<<str7; // str7: "test"


    /* 字符串拼接 */
    QString str8="apple";
    QString str9="pen";
    QString str10=str8+str9; // str10: "applepen"
    qDebug()<<"str10:"<<str10; // str11: "applepen"

    // append()
    QString str11=str8.append(str9); // 和c++的string基本是一样的
    qDebug()<<"str11:"<<str11; // str11: "applepen"

    // asprintf()  ??? 不对 ???
    // asprintf() 与sprintf() 功能相同
    QString str12=QString::asprintf("%s,%s",str8.data(),str9.data());
    qDebug()<<"str12:"<<str12;

    QString str13=QString("%1%2").arg(str8).arg(str9);
    qDebug()<<"str13:"<<str13; // str13: "applepenpen"

    /* 插入 */
    QString str14="helloworld";
    str14.insert(0,"123");
    qDebug()<<"str14:"<<str14; // str14: "123helloworld"
    str14.insert(8," ");
    qDebug()<<"str14:"<<str14; // str14: "123hello world"

    /* 字符串转数字 */
    QString str15="123";
    qDebug()<<str15.toUInt(); // 123
    QString str16="2.3";
    qDebug()<<str16.toFloat(); // 2.3

    /* 数字转字符串 */
    float f1=1.234f;
    quint32 uint=1234; // quint32 == unsigned int 4字节

    qDebug()<<QString::asprintf("%f",f1); // "1.234000"
    qDebug()<<QString::asprintf("%.2f",f1); // 保留两位小数 "1.23"
    qDebug()<<QString::number(f1,'f',2); // 保留两位小数 "1.23"

    // 数字转字符串 转换16进制
    qDebug()<<QString::number(uint,16); // 16为base //"4d2"
    // 数字转字符串 转换8进制
    qDebug()<<QString::number(uint,8); // 8为base // "2322"

    /* 数字统计 */
    QString str17="hellohhhworlhd";
    qDebug()<<str17.count("h"); // 5

    /* 字符查找 */
    QString str18="11223344";

    // 正序查找
    qDebug()<<str18.indexOf("1"); // 0
    // 倒序查找
    qDebug()<<str18.lastIndexOf("1"); // 1
    qDebug()<<str18.indexOf(static_cast<char>(0x32)); // 0x32 == '2' // 2

    // 是否包含
    // 可以是字符,或子串
    qDebug()<<str18.contains("22"); // true

    // 判断开头
    qDebug()<<str18.startsWith("11",Qt::CaseSensitive); // 区分大小写 true
    qDebug()<<str18.startsWith("11",Qt::CaseInsensitive); // 不区分大小写 true

    w.show();
    return a.exec();
}
// 是否有字符
qDebug()<<QString().isEmpty(); // true
qDebug()<<QString("").isEmpty(); // true
qDebug()<<QString("x").isEmpty(); // false
qDebug()<<QString("abc").isEmpty(); // false

// 是否为空
qDebug()<<QString().isNull(); // true
qDebug()<<QString("").isNull(); // false
qDebug()<<QString("abc").isNull(); // false

// 字符串截取
QString str19="hello world";
qDebug()<<"str19: "<<str19.mid(2,3); // 从索引2开始截取,截取3个字符 str19:  "llo"
qDebug()<<"str19: "<<str19.mid(3); // 从索引3开始截取,截取到最后 str19:  "lo world"
qDebug()<<"str19: "<<str19.left(1); // 截取左边1个 str19:  "h"
qDebug()<<"str19: "<<str19.right(1); // 截取右边2个 str19:  "d"

// 字符串分割
QString str20="/hello/world/qt/cmd";
QString::SectionFlag flag=QString::SectionSkipEmpty;
QString str21=str20.section('/',3,4); // str21:  "qt/cmd"
QString str22=str20.section('/',3,4,flag); // str22:  "cmd" flag 忽略空字段
qDebug()<<"str21: "<<str21;
qDebug()<<"str22: "<<str22;

QString str25="/hello/world/qt/cmd";
QStringList str25_list=str25.split('/');
qDebug()<<str25_list; // ("", "hello", "world", "qt", "cmd")
QStringList str25_list2=str25.split('/',QString::SkipEmptyParts);
qDebug()<<str25_list2; // ("hello", "world", "qt", "cmd")

// 字符串删除
QString str23="hello world";
str23.clear(); // 等价于str23="";
qDebug()<<"str23: "<<str23; // str23:  ""

// 字符串替换
QString str24="hello world";
str24.replace("world","qt");
qDebug()<<"str24: "<<str24; // str24:  "hello qt"


// 字符串比较
int x = QString::compare("aUtO", "AuTo", Qt::CaseInsensitive);  // compare x:  0
int y = QString::compare("aUtO", "AuTo", Qt::CaseSensitive);    // compare y:  32 a-A
qDebug()<<"compare x: "<<x;
qDebug()<<"compare y: "<<y;

int z = QString::compare("auto", "Car", Qt::CaseSensitive);     // compare z:  30 a-C
int k = QString::compare("auto", "Car", Qt::CaseInsensitive);   // compare k:  -2
qDebug()<<"compare z: "<<z;
qDebug()<<"compare k: "<<k;

bool ret =  QString ("123") == QString("123");
qDebug()<<"compare ret: "<<ret; // compare ret:  true

// 字符串长度
QString str26="hello world";
qDebug()<<"str26: "<<str26.length(); // str26:  11
qDebug()<<"str26: "<<str26.size(); // str26:  11
qDebug()<<"str26: "<<str26.count(); // str26:  11

// 大小写转换
QString str27="hello world";
qDebug()<<"str27: "<<str27.toUpper(); // str27:  "HELLO WORLD"
qDebug()<<"str27: "<<str27; // str27:  "hello world"

QString/char/char*

char -> QString

char ch28='b';
QString str28=QString(ch28);
qDebug()<<"str28: "<<str28; // str28:  "b"

char -> QString*

const char* pstr="test";
QString str7(pstr); // test

QString -> (char)*

Qstring 转char* 需要借助QByteArray

QString str29="hello 28";
QByteArray arr29=str29.toLatin1();
char *str30;
str30=arr29.data();
qDebug()<<str30; // hello 28

QString -> std::string

https://blog.csdn.net/maoyingyong/article/details/125753854
qDebug() 不能直接输出std::string 需要进行转换

QString.toStdString();

std::string stdstr31=QString("hello 31").toStdString();
// qDebug()<<"str31: "<<stdstr31;
std::cout<<"str31: "<<stdstr31<<std::endl;

std::string-> QString

std::string stdstr32="hello 32";
QString str32=QString::fromStdString(stdstr32);
qDebug()<<str32; // hello 32

QByteArray

二进制、十六进制、char数组存储
字节数据或字符串 ???
存储字节数组的时候,结尾也保留了一个额外的’\0’ ???

无论QByteArray构造函数中是字符、字符串还是字节数值,最终构建的都是对应元素的字节数值,qDebug()会视上下文而输出字符串还是十六进制数
QByteArray.toHex() 输出的是字节数值的十六进制表示
QByteArray.data() 返回指向字节数组中存储的数据的指针,且包括’\0’!!!
QByteArray.size() 不包括’\0’
QByteArray.toHex() 不包括’\0’

https://blog.csdn.net/kenfan1647/article/details/120326901 暂时可以不看

#include "widget.h"

#include <QApplication>
#include <QByteArray>
#include <QDebug>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    Widget w;


    /* 初始化 */
    QByteArray arr1("hello");
    qDebug()<<"arr1: "<<arr1<<" : "<<arr1.toHex(); // arr1:  "hello"  :  "68656c6c6f"

    QByteArray arr2(arr1); //拷贝构造
    qDebug()<<"arr2: "<<arr2<<" : "<<arr2.toHex(); // arr2:  "hello"  :  "68656c6c6f"
    QByteArray arr3(3,'a'); // 构造函数3个a
    qDebug()<<"arr3: "<<arr3<<" : "<<arr3.toHex(); // arr3:  "aaa"  :  "616161"

    // 深拷贝初始化
    const char cart[]={'c','a','\0','r','\0','t'};
    QByteArray arr4(cart,6);
    qDebug()<<"arr4: "<<arr4<<" : "<<arr4.toHex(); // arr4:  "ca\x00r\x00t"  :  "636100720074"
//    qDebug()<<"arr4: "<<arr4[2]<<Qt::endl; // ???

    QByteArray arr5={0x02,0x39}; // 等价于 QByteArray arr3(2,0x39); // 构造函数3个a
    qDebug()<<"arr5: "<<arr5<<" : "<<arr5.toHex(); // arr5:  "99"  :  "3939"

    char cart2[]={0x02,0x39};
    QByteArray arr5_2=QByteArray((const char *)cart2,sizeof(cart2));
    qDebug()<<"arr5_2: "<<arr5_2<<" : "<<arr5_2.toHex(); // arr5_2:  "\x02""9"  :  "0239"

    QByteArray arr6;
    arr6.resize(5);
    arr6[0] = 0x3c;
    arr6[1] = 0xb8;
    arr6[2] = 0x64;
    arr6[3] = 0x18;
    arr6[4] = 0xca;
    qDebug()<<"arr6: "<<arr6<<" : "<<arr6.toHex(); // arr6:  "<\xB8""d\x18\xCA"  :  "3cb86418ca"

    // 函数初始化
    QByteArray arr8("aaa");
    arr8.fill('o');
    qDebug()<<"arr8: "<<arr8<<" : "<<arr8.toHex();

    // 下面这种函数初始化方法不行
//    QByteArray arr8_2;
//    arr8_2.fill('o');
//    qDebug()<<"arr8_2: "<<arr8_2<<" : "<<arr8_2.toHex(); // ""

    QByteArray arr8_3;
    arr8_3.fill('o',10);
    qDebug()<<"arr8_3: "<<arr8_3<<" : "<<arr8_3.toHex(); // arr8_3:  "oooooooooo"  :  "6f6f6f6f6f6f6f6f6f6f"

    /* 拷贝 */
    // 深拷贝
    const char cart3[]={'c','a','\0','r','\0','t'};
    QByteArray arr9=QByteArray((const char *)cart3,sizeof(cart3));
    qDebug()<<"arr9: "<<arr9<<" : "<<arr9.toHex(); // arr9:  "ca\x00r\x00t"  :  "636100720074"
    // 浅拷贝
    QByteArray arr9_2(QByteArray::fromRawData((const char *)cart3,sizeof(cart3)));
    qDebug()<<"arr9_2: "<<arr9_2<<" : "<<arr9_2.toHex(); // arr9_2:  "ca\x00r\x00t"  :  "636100720074"

    /* 访问 */
    QByteArray arr7;
    arr7.resize(5);
    arr7[0] = 0x3c;
    arr7[1] = 0xb8;
    arr7[2] = 0x64;
    arr7[3] = 0x18;
    arr7[4] = 0xca;
    qDebug()<<"arr7: "<<arr7<<" : "<<arr7.toHex();

    // [] 和 .data()[] 可读可写
    qDebug()<<"arr7: "<<arr7[4]<<" "<<arr7.data()[4];
    arr7[3]=0x33;
    arr7.data()[4]=0x35;
    qDebug()<<"arr7: "<<arr7[3]<<" "<<arr7.data()[4];
    // .at() .constData()[] 只读
    qDebug()<<"arr7: "<<arr7.at(4)<<" "<<arr7.constData()[4];
    qDebug()<<arr7[2];

    /* 判空 */
    // 如果字节数组大小为0或字节数组为空,则为空
    // 判断是否有字节数据
    qDebug()<<arr7.isEmpty(); // false
    qDebug()<<QByteArray().isEmpty(); // true
    qDebug()<<QByteArray("").isEmpty(); // true
    qDebug()<<QByteArray("abc").isEmpty(); //false

    /* 添加 */
    /* append insert prepend */
    QByteArray arr10(2,'a');
    qDebug()<<"arr10: "<<arr10.toHex(); // arr10:  "6161"

    // 头部添加
//    arr10.push_front(0x30); // 隐式转换
    arr10.push_front(static_cast<char>(0x30)); // 隐式转换,截取低八位
    qDebug()<<"arr10: "<<arr10.toHex(); // arr10:  "306161"
    arr10.push_front(QByteArray(2,'d'));
    qDebug()<<"arr10: "<<arr10.toHex(); // arr10:  "6464306161"

    // 尾部添加
    arr10.push_back(static_cast<char>(0x30)); // 隐式转换
    qDebug()<<"arr10: "<<arr10.toHex(); // arr10:  "646430616130"
    char cart4[]={0x30,0x30};
    arr10.push_back(QByteArray((const char *)cart4,sizeof(cart4))); // 隐式转换
    qDebug()<<"arr10: "<<arr10.toHex(); // arr10:  "6464306161303030"

    // 任意位置添加
    arr10.insert(3,static_cast<char>(0x30));
    qDebug()<<"arr10: "<<arr10.toHex(); // arr10:  "646430306161303030"
    arr10.insert(3,QByteArray(2,'9'));

    /* 替换查找 */
    /* indexOf lastIndexOf startswith constains count*/
    QByteArray arr11("hello world");
    qDebug()<<"arr11: "<<arr11<<" "<<arr11.toHex(); // arr11:  "hello world"   "68656c6c6f20776f726c64"

    qDebug()<<arr11.indexOf('l'); // 2
    qDebug()<<arr11.lastIndexOf('l'); // 9
    qDebug()<<arr11.count('l'); // 3

    /* 替换 */
    /* replace split left right mid chop chopped*/

    // 根据索引替换
    QByteArray arr12("Say yes!");
    qDebug()<<"arr12: "<<arr12<<" "<<arr12.toHex();
    QByteArray arr13("no");
    qDebug()<<"arr13: "<<arr13<<" "<<arr13.toHex();
    arr12.replace(4,3,arr13); // 3???
    qDebug()<<"arr12: "<<arr12<<" "<<arr12.toHex();

    // 根据元素替换
    QByteArray arr14("hello world");
    qDebug()<<"arr14: "<<arr14<<" "<<arr14.toHex();
    arr14.replace(QByteArray("world"),QByteArray("qt"));
    qDebug()<<"arr14: "<<arr14<<" "<<arr14.toHex();

    /* 截断 */
    qDebug()<<arr14.left(2); // he
    qDebug()<<arr14.right(2); // qt
    qDebug()<<arr14.mid(3); // [3-末尾 :lo qt
    qDebug()<<arr14.chopped(3); // 砍掉末尾3个 hello

    /* 删除 */
    qDebug()<<arr14.remove(1,2); // index [1,2]
//    arr14.clear(); // inplace操作
//    qDebug()<<arr14.isEmpty();

    QByteArray arr15("hello world");
    arr15.erase(arr15.begin(),arr15.begin()+2); // 删除 [:3]
    qDebug()<<arr15;


    // 下面转换后的是进制数的文本 其中包含等价于数字n到基数的字符串
    int n = 63;
    qDebug()<<QByteArray::number(n).toHex();              // returns "63" "3633" tohex也是字符的hex不是实际值的hex
    qDebug()<<QByteArray::number(n, 16);          // returns "3f"
    qDebug()<<QByteArray::number(n, 16).toUpper();  // returns "3F"
    qDebug()<<QByteArray::number(n, 2);          // returns "111111"
    qDebug()<<QByteArray::number(n, 8);          // returns "77"


    w.show();
    return a.exec();
}

size

size()函数总是返回整个数组的大小,但不包括QByteArray自动添加的终止的’\0’

QByteArray arr1("hello");
qDebug()<<arr1.size(); // 5
qDebug()<<arr1.length(); // 5


// size()函数总是返回整个数组的大小,包括嵌入的'\0'字节
const char cart[]={'c','a','\0','r','\0','t'};
QByteArray arr4(cart,6);
qDebug()<<"arr4: "<<arr4<<" : "<<arr4.toHex(); // arr4:  "ca\x00r\x00t"  :  "636100720074"
qDebug()<<arr4.size(); //6 

null/empty

一个null字节数组总是empty的,但是一个empty字节数组不一定时null

qDebug() << QByteArray("").isNull();        // returns false
qDebug() << QByteArray("").isEmpty();       // returns true

QByteArray/hex

  • hex -> QByteArray

fromhex注意:每16位作为转换单元
https://blog.csdn.net/m0_46577050/article/details/12138857

QByteArray text = QByteArray::fromHex("517420697320677265617421"); // "517420697320677265617421" 只是一个进制数字符串
text.data();            // returns "Qt is great!" .data() 包括\0

// 进阶
QString str26="395139513951";
QByteArray arr26=QByteArray::fromHex(str26.toUtf8()); // 
qDebug()<<"arr26: "<<arr26<<" "<<arr26.toHex(); // arr26:  "9Q9Q9Q"   "395139513951"
qDebug()<<"str26: "<<str26.toUtf8()<<" "<<str26.toUtf8().toHex(); // str26:  "395139513951"   "333935313339353133393531" 说明Qstring转换位QByteArray时,每个字符存储一个字节
  • QByteArray -> hex
QByteArray ba;
ba.resize(3);
ba[0] = 0x30;
ba[1] = 0x31;
ba[2] = 0x32;
qDebug() << ba.toHex(); //return "303132" 

QByteArray/数值

  • 数值 -> QByteArray
QByteArray arr17("1234"); // 1234
qDebug()<<arr17.toInt(); // 默认base 10  4660
qDebug()<<arr17.toInt(nullptr,16); // 将qbytearray的数值作为16进制进行转换,转换成10进制

qint32 int_17=arr17.toInt();
qDebug()<<"to int32"<<int_17;


QByteArray arr18("1234.567");
qDebug()<<arr18.toInt(); // 小数都视为0
qDebug()<<arr18.toDouble(); // 1234.567
qDebug()<<arr18.toFloat(); // 1234.567

QByteArray arr19("FF");
bool arr19_ok;
qDebug()<<arr19.toInt(&arr19_ok,16); // 255 arr19_ok=true
  • QByteArray -> 数值
// 下面转换后的是进制数的文本(字符串) 其中包含等价于数字n到基数的字符串
int n = 63;
qDebug()<<QByteArray::number(n).toHex();              // returns "63" "3633" tohex也是字符的hex不是实际值的hex
qDebug()<<QByteArray::number(n, 16);          // returns "3f"
qDebug()<<QByteArray::number(n, 16).toUpper();  // returns "3F"
qDebug()<<QByteArray::number(n, 2);          // returns "111111"
qDebug()<<QByteArray::number(n, 8);          // returns "77"


QByteArray arr22;
int n2 = 63;
arr22.setNum(n2);           // arr22 == "63"
arr22.setNum(n2, 16);       // arr22 == "3f"
qDebug()<<"arr22: "<<arr22<<" "<<arr22.toHex(); // arr22:  "3f"   "3366"

QByteArray/char数组/char*

  • QByteArray -> char数组
QByteArray arr16("hello world");
char *p16=arr16.data(); // .data() 包括\0
qDebug()<<"p16: "<<p16; // p16:  hello world
qDebug()<<"p16*: "<<*p16; //h

// 浅拷贝
char *p16_2=new char[12]; // 注意是12 =11 + \0
p16_2=arr16.data();
qDebug()<<"p16_2: "<<p16_2;
qDebug()<<"p16_2*: "<<*p16_2; //h

// 深拷贝
char *p16_3=new char[12]; //
memcpy(p16_3,arr16.data(),12);
qDebug()<<"p16_3: "<<p16_3;

QString tmp = "test";
QByteArray text = tmp.toLocal8Bit(); //执行toLocal8Bit就相当于将unicode编码的qstring转为了本地编码格式,对于windows系统,本地编码格式为GBK,linux系统为UTF-8
char *data = new char[text.size() + 1]; // QByteArray .size不包括\0
strcpy(data, text.data()); // c++库函数
delete [] data;
  • char数组/char -> QByteArray*

const char * --> 传递给QByteArray字符串

QByteArray ba("hello");
//深拷贝
const char cart3[]={'c','a','\0','r','\0','t'};
QByteArray arr9=QByteArray((const char *)cart3,sizeof(cart3));
qDebug()<<"arr9: "<<arr9<<" : "<<arr9.toHex(); // arr9:  "ca\x00r\x00t"  :  "636100720074"

// 浅拷贝
QByteArray arr9_2(QByteArray::fromRawData((const char *)cart3,sizeof(cart3)));
qDebug()<<"arr9_2: "<<arr9_2<<" : "<<arr9_2.toHex(); // arr9_2:  "ca\x00r\x00t"  :  "636100720074"
QByteArray/QString

一般使用QString来存储字符串数据(存储的是16位unicode字符)

  • QByteArray -> QString

或见.data(): QByteArray -> char数组

QByteArray arr("hello");
QString str=arr; // 可以直接赋值

QString str2(arr);
  • QString -> QByteArray
QString str("abc123");
//ASCII
QByteArray arr20 = str.toLatin1(); // 不包括\0
qDebug()<<arr20<<" "<<arr20.toHex(); // "abc123"   "616263313233" 不包括\0

// Unicode
QByteArray arr21 = str.toUtf8();
//    QByteArray arr21 = str.toLocal8Bit(); // "abc123"   "616263313233"  执行toLocal8Bit就相当于将unicode编码的qstring转为了本地编码格式,对于windows系统,本地编码格式为GBK,linux系统为UTF-8
qDebug()<<arr21<<" "<<arr21.toHex(); // "abc123"   "616263313233"

例子 – 注意
https://blog.csdn.net/Kelvin_Yan/article/details/106096841

QString qstr("你好");
char cstr[64] ={0};
memcpy(cstr, qstr.toLocal8Bit().data(), qstr.toLocal8Bit().size());  //注意,QByteArray::size()不包含终止符,要不初始化cstr为0,要不qstr.toLocal8Bit().size()+1

// 下面可能没有问题,但是不建议这么写
QString qstr("你好");
QByteArray qbarr = qstr.toLocal8Bit();  //保证qbarr对象的生命期就可以保证字符串的内容有效
char *cstr = qbarr.data();     //一旦qbarr析构了,cstr也同时无效了

// 最好不要写成下面这种
QString qstr("你好");
char *cstr = qstr.toLocal8Bit().data();   

深度思考

qDebug() 默认讲QByteArray转换字符串进行输出

QString str26="395139513951";
QByteArray arr26=QByteArray::fromHex(str26.toUtf8());
qDebug()<<"arr26: "<<arr26<<" "<<arr26.toHex(); // arr26:  "9Q9Q9Q"   "395139513951"
qDebug()<<"str26: "<<str26.toUtf8()<<" "<<str26.toUtf8().toHex(); // str26:  "395139513951"   "333935313339353133393531"
qDebug()<<"str26: "<<str26.toLatin1().toHex(); // str26:  "333935313339353133393531"

大小端转换 / 存储与移位

https://yujiang.blog.csdn.net/article/details/122407131

QByteArray d;
d.resize(sizeof(int));
int a=0x1234;
memcpy(d.data(),&a,sizeof(a)); // 0x32 0x12 0x00 0x00 小端模式存储
char a1=(a>>8) & 0xff; // 0x12 以大端看位移
char a2=a & 0xff; // 0x34
char a3=(a<<8) & 0xff;

QByteArray c;
c.resize(sizeof(int));
int b=0xff;
memcpy(c.data(),&b,sizeof(b)); // 0xff 0x00 0x00 0x00

其他函数

https://blog.csdn.net/qq_39048131/article/details/124193719

问题

qDebug() 换行

// 深拷贝初始化
const char cart[]={'c','a','\0','r','\0','t'};
QByteArray arr4(cart,6);
qDebug()<<"arr4: "<<arr4<<" : "<<arr4.toHex();
qDebug()<<"arr4: "<<arr4[2]<<Qt::endl; // ???

char/QChar/uchar

  • qint8 1字节 -> char
  • uchar 1字节 -> unsigned char

qstring.data

qstring/char * /char []

https://blog.csdn.net/Littlehero_121/article/details/105843671
https://blog.csdn.net/qq_46485161/article/details/116164460

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值