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