C/C++程序中数字int、字符串string、char*之间的转换方法汇总
Qt中 QString 和int, char等的“相互”转换
QString与int 之前相互转换:
1、QString 转int
QString str("100");
int tmp=str.toInt();
2、int 转QString
int tmp =100;
QString str=QString::number(tmp);
QStringLiteral
是Qt5中新引入的一个用来从“字符串常量”创建QString对象的宏(字符串常量指在源码中由””包含的字符串)
StringLiteral 宏可以在编译期把代码里的常量字符串 str 直接构造为 QString 对象,于是运行时就不再需要额外的构造开销了。
QStringLiteral("GAAAA");
Qstring 转换char*
const char *p = qstr.toStdString().data();
或者
QString fileStr = dateTimeStr + ".txt";
const char *fileStrInfo = fileStr.toLatin1().constData(); //toUtf8()
QByteArray相关
Qt 最常用的字符串类是内码固定的 QString,而针对传统类似 C 语言 char* 的字符串,Qt 提供了 QByteArray 类来处理。QString 的字符单元是 QChar,QByteArray 的字节单元是 char。头文件 不仅自身以类的形式提供,它还针对传统 C 语言的字符串函数做了安全版本的封装,都加了 q 字母前缀,如 qstrlen、qstrncmp、qstrcpy,这些是全局函数,专门处理传统 C 语言的 char* 字符串,用法与 C 语言风格完全类似,比较简单,本节就不介绍了。本节主要介绍 QByteArray 类的使用。
QByteArray 类可以处理以 ‘\0’ 结尾的传统字符串,包括 UTF-8 编码和其他如 GBK、Big5 等多字节编码的字符串,在作为字符串使用时,QByteArray 内部字符编码格式是不限定的,可以是任意编码的,所以程序员自己必须要事先确定程序会用到哪些编码的 QByteArray 。因为 Qt5 源文件规定是 UTF-8 编码的,所以 QByteArray 内部使用 UTF-8 编码的字符串居多。QByteArray 在赋值、传参数、返回值时也是使用隐式共享机制提高运行效率,只有字符串发生修改时才会执行深拷贝。
在文件处理、网络数据收发等场景,QByteArray 类是作为纯字节数组来使用的,里面可以包含任意数据,比如一堆 ‘\0’,这时不要拿它当字符串看,它的存储长度与 qstrlen 计算的长度经常不一致。对于网络数据收发,QByteArray 经常配合 QDataStream 使用,对 Qt 数据类型做串行化(Serializing)。
https://qtguide.ustclug.org/ch03-04.htm
//testqbytearray.cpp
#include <QApplication>
#include <QTextBrowser>
#include <QDebug>
#include <QByteArray>
#include <QDataStream>
#include <QTextCodec>
#define DBUG qDebug()<< "["<< __LINE__ << "]"
void TestStr() //内码 UTF-8
{
//数值与字符串转换
int nDec = 800;
QByteArray basDec;
basDec.setNum(nDec); //数值转字符串
DBUG <<basDec;
QByteArray basReal = "125.78999";
double dblReal = basReal.toDouble(); //字符串转数值
DBUG << fixed<<dblReal;
//运算符
QByteArray basABCD = "ABCD";
QByteArray basXYZ = "XYZ";
DBUG <<(basABCD < basXYZ); //二者字符编码一致才能比较!
DBUG <<(basABCD == basXYZ);
DBUG <<(basABCD >= basXYZ);
DBUG <<(basABCD + basXYZ);
/*
[ 17 ] "800"
[ 20 ] 125.789990
[ 25 ] true
[ 26 ] false
[ 27 ] false
[ 28 ] "ABCDXYZ"
*/
//子串处理
QByteArray basHanzi = "1234打印汉字";
//作为字符串时 QByteArray::length() 和 qstrlen() 一致
DBUG <<basHanzi.length()<<"\t"<<qstrlen( basHanzi.data() );
//重复
QByteArray basMoreHanzi = basHanzi.repeated(2);
DBUG << "basMoreHanzi:" << basMoreHanzi;
DBUG <<basMoreHanzi.count("1234"); //统计次数
DBUG <<basMoreHanzi.startsWith("1234"); //开头判断
DBUG <<basMoreHanzi.endsWith("汉字"); //结尾判断
DBUG <<basMoreHanzi.indexOf("1234"); //从左边查出现位置
DBUG <<basMoreHanzi.lastIndexOf("1234"); //从右边查出现位置
//替换
basMoreHanzi.replace("1234", "一二三四");
DBUG <<basMoreHanzi;
/*
[ 42 ] 16 16
[ 45 ] basMoreHanzi: "1234\xE6\x89\x93\xE5\x8D\xB0\xE6\xB1\x89\xE5\xAD\x97""1234\xE6\x89\x93\xE5\x8D\xB0\xE6\xB1\x89\xE5\xAD\x97"
[ 46 ] 2
[ 47 ] true
[ 48 ] true
[ 49 ] 0
[ 50 ] 16
[ 53 ] "\xE4\xB8\x80\xE4\xBA\x8C\xE4\xB8\x89\xE5\x9B\x9B\xE6\x89\x93\xE5\x8D\xB0\xE6\xB1\x89\xE5\xAD\x97\xE4\xB8\x80\xE4\xBA\x8C\xE4\xB8\x89\xE5\x9B\x9B\xE6\x89\x93\xE5\x8D\xB0\xE6\xB1\x89\xE5\xAD\x97"
*/
//切割字符串
QByteArray basComplexFile = " /home/user/somefile.txt \t\t ";
QByteArray basFileName = basComplexFile.trimmed(); //剔除两端空白
DBUG <<basFileName;
//分隔得到新的 QByteArray 对象列表
QList<QByteArray> baList = basFileName.split('/');
//打印
for(int i=0; i<baList.length(); i++)
{
DBUG <<i<<"\t"<<baList[i];
}
//没有段落函数
/*
[ 69 ] "/home/user/somefile.txt"
[ 75 ] 0 ""
[ 75 ] 1 "home"
[ 75 ] 2 "user"
[ 75 ] 3 "somefile.txt"
*/
}
/*
//C++ 结构体方法
struct NetData
{
int nVersion;
double dblValue;
char strName[256];
};
*/
//Qt 串行化方法
QByteArray TestSerialOut()
{
//数据
int nVersion = 1;
double dblValue = 125.78999;
QString strName = QObject::tr("This an example.");
//字节数组保存结果
QByteArray baResult;
//串行化的流
QDataStream dsOut(&baResult, QIODevice::ReadWrite); //做输出,构造函数用指针
//设置Qt串行化版本
dsOut.setVersion(QDataStream::Qt_5_0);//使用Qt 5.0 版本流
//串行化输出
dsOut<<nVersion<<dblValue<<strName;
//显示长度
DBUG <<baResult.length()<<"\t"<<qstrlen(baResult.data()); //[ 115 ] 48 0
//返回对象
return baResult;
}
void TestSerialIn(const QByteArray& baIn)
{
//输入流
QDataStream dsIn(baIn); //只读的流,构造函数用常量引用
//设置Qt串行化版本
dsIn.setVersion(QDataStream::Qt_5_0);//使用Qt 5.0 版本流
//变量
int nVersion;
double dblValue;
QString strName;
//串行化输入
dsIn>>nVersion>>dblValue>>strName;
//打印
DBUG <<nVersion;
DBUG <<fixed<<dblValue;
DBUG <<strName;
/*
[ 134 ] 1
[ 135 ] 125.789990
[ 136 ] "This an example."
*/
}
//测试协作
void TestCooperation()
{
//源字符串
QString strSrc = QObject::tr("1234abcd 千秋萬載 壹統江湖");
//转为 UTF-8
DBUG <<strSrc.toUtf8();
//明确地转为 GB18030
QTextCodec *codecGB = QTextCodec::codecForName("GB18030");
QByteArray strGB = codecGB->fromUnicode(strSrc); //转为GB18030
DBUG <<strGB;
DBUG <<codecGB->toUnicode(strGB); //转回QString
//明确地转为 Big5
QTextCodec *codecBig5 = QTextCodec::codecForName("Big5");
QByteArray strBig5 = codecBig5->fromUnicode(strSrc); //转为Big5
DBUG <<strBig5;
DBUG <<codecBig5->toUnicode(strBig5); //转回QString
/*
[ 150 ] "1234abcd \xE5\x8D\x83\xE7\xA7\x8B\xE8\x90\xAC\xE8\xBC\x89 \xE5\xA3\xB9\xE7\xB5\xB1\xE6\xB1\x9F\xE6\xB9\x96"
[ 155 ] "1234abcd \xC7\xA7\xC7\xEF\xC8""f\xDD""d \xD2\xBC\xBDy\xBD\xAD\xBA\xFE"
[ 156 ] "1234abcd 千秋萬載 壹統江湖"
[ 161 ] "1234abcd \xA4""d\xAC\xEE\xB8U\xB8\xFC \xB3\xFC\xB2\xCE\xA6\xBF\xB4\xF2"
[ 162 ] "1234abcd 千秋萬載 壹統江湖"
*/
}
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
// QString strText = QObject::tr("测试 QByteArray");
// QTextBrowser tb;
// tb.setText(strText);
// tb.setGeometry(40, 40, 400, 300);
// tb.show();
//str
TestStr();
DBUG <<"............................................"<<endl;
//serialization
QByteArray baSerial = TestSerialOut();
//baSerial 可用于网络发送
//接收到 baSerial 之后解析
TestSerialIn(baSerial);
DBUG <<endl;
//测试协作
TestCooperation();
return a.exec();
}
[ 17 ] "800"
[ 20 ] 125.789990
[ 25 ] true
[ 26 ] false
[ 27 ] false
[ 28 ] "ABCDXYZ"
[ 42 ] 16 16
[ 45 ] basMoreHanzi: "1234\xE6\x89\x93\xE5\x8D\xB0\xE6\xB1\x89\xE5\xAD\x97""1234\xE6\x89\x93\xE5\x8D\xB0\xE6\xB1\x89\xE5\xAD\x97"
[ 46 ] 2
[ 47 ] true
[ 48 ] true
[ 49 ] 0
[ 50 ] 16
[ 53 ] "\xE4\xB8\x80\xE4\xBA\x8C\xE4\xB8\x89\xE5\x9B\x9B\xE6\x89\x93\xE5\x8D\xB0\xE6\xB1\x89\xE5\xAD\x97\xE4\xB8\x80\xE4\xBA\x8C\xE4\xB8\x89\xE5\x9B\x9B\xE6\x89\x93\xE5\x8D\xB0\xE6\xB1\x89\xE5\xAD\x97"
[ 69 ] "/home/user/somefile.txt"
[ 75 ] 0 ""
[ 75 ] 1 "home"
[ 75 ] 2 "user"
[ 75 ] 3 "somefile.txt"
[ 176 ] ............................................
[ 115 ] 48 0
[ 134 ] 1
[ 135 ] 125.789990
[ 136 ] "This an example."
[ 183 ]
[ 150 ] "1234abcd \xE5\x8D\x83\xE7\xA7\x8B\xE8\x90\xAC\xE8\xBC\x89 \xE5\xA3\xB9\xE7\xB5\xB1\xE6\xB1\x9F\xE6\xB9\x96"
[ 155 ] "1234abcd \xC7\xA7\xC7\xEF\xC8""f\xDD""d \xD2\xBC\xBDy\xBD\xAD\xBA\xFE"
[ 156 ] "1234abcd 千秋萬載 壹統江湖"
[ 161 ] "1234abcd \xA4""d\xAC\xEE\xB8U\xB8\xFC \xB3\xFC\xB2\xCE\xA6\xBF\xB4\xF2"
[ 162 ] "1234abcd 千秋萬載 壹統江湖"
12:07:50: 程序异常结束。
12:07:50: The process was ended forcefully.
12:07:50: F:/360Downloads/build-testqbytearray-Desktop_Qt_5_9_8_MinGW_32bit-Debug/debug/testqbytearray.exe crashed.
12:07:52: Starting F:\360Downloads\build-testqbytearray-Desktop_Qt_5_9_8_MinGW_32bit-Debug\debug\testqbytearray.exe...
[ 17 ] "800"
[ 20 ] 125.789990
[ 25 ] true
[ 26 ] false
[ 27 ] false
[ 28 ] "ABCDXYZ"
[ 42 ] 16 16
[ 45 ] basMoreHanzi: "1234\xE6\x89\x93\xE5\x8D\xB0\xE6\xB1\x89\xE5\xAD\x97""1234\xE6\x89\x93\xE5\x8D\xB0\xE6\xB1\x89\xE5\xAD\x97"
[ 46 ] 2
[ 47 ] true
[ 48 ] true
[ 49 ] 0
[ 50 ] 16
[ 53 ] "\xE4\xB8\x80\xE4\xBA\x8C\xE4\xB8\x89\xE5\x9B\x9B\xE6\x89\x93\xE5\x8D\xB0\xE6\xB1\x89\xE5\xAD\x97\xE4\xB8\x80\xE4\xBA\x8C\xE4\xB8\x89\xE5\x9B\x9B\xE6\x89\x93\xE5\x8D\xB0\xE6\xB1\x89\xE5\xAD\x97"
[ 69 ] "/home/user/somefile.txt"
[ 75 ] 0 ""
[ 75 ] 1 "home"
[ 75 ] 2 "user"
[ 75 ] 3 "somefile.txt"
[ 185 ] ............................................
[ 115 ] 48 0
[ 134 ] 1
[ 135 ] 125.789990
[ 136 ] "This an example."
[ 192 ]
[ 150 ] "1234abcd \xE5\x8D\x83\xE7\xA7\x8B\xE8\x90\xAC\xE8\xBC\x89 \xE5\xA3\xB9\xE7\xB5\xB1\xE6\xB1\x9F\xE6\xB9\x96"
[ 155 ] "1234abcd \xC7\xA7\xC7\xEF\xC8""f\xDD""d \xD2\xBC\xBDy\xBD\xAD\xBA\xFE"
[ 156 ] "1234abcd 千秋萬載 壹統江湖"
[ 161 ] "1234abcd \xA4""d\xAC\xEE\xB8U\xB8\xFC \xB3\xFC\xB2\xCE\xA6\xBF\xB4\xF2"
[ 162 ] "1234abcd 千秋萬載 壹統江湖"
uchar数组 和 char数组 互转
#include <stdio.h>
#include <string.h>
void convert_uchar_to_char(unsigned char* in_uchar, char* out_char, int uc_len)
{
int i=0;
char c[2];
char out_char_tmp[1024];
memset(c,0x0, sizeof(c));
memset(out_char_tmp,0x0, sizeof(out_char_tmp));
for(i=0; i < uc_len; i++)
{
sprintf(c,"%c", in_uchar[i]);
//printf("[%d]:%s\n", i, c);
strcat(out_char_tmp, c);
}
strcpy(out_char, out_char_tmp);
}
void convert_char_to_uchar(char* in_char, unsigned char* out_uchar, int c_len)
{
int i;
char char_buf[1024];
//unsigned char uchar_buf[1024];
memset(char_buf,0x0, sizeof(char_buf));
//memset(uchar_buf,0x0, sizeof(uchar_buf));
strcpy(char_buf,in_char);
printf("\n[%d]c_len:%d\n", __LINE__, c_len);
for ( i=0; i<c_len; i++ )
{
//uchar_buf[i]=(unsigned char)char_buf[i];
out_uchar[i]=(unsigned char)char_buf[i];
}
}
int main()
{
//printf("uchar %d\n", sizeof(unsigned char));
int i=0;
char c_str[1024] = {0};
char c_strxxx[1024] = {0};
strcpy(c_str,"nWBUqDWDmO5ZU2J0pSkF66HwoA0vuvUTK6zPotvpycLKV1QxJ2c4sKRot5DAeXdx");
unsigned char uc_str[1024] = {0};
convert_char_to_uchar(c_str, uc_str, strlen(c_str));
printf("\n[%d]--------------convert_char_to_uchar->uc_str:%s----------\n", __LINE__,uc_str);
for ( i=0; i<strlen(c_str); i++ )
{
printf("[%d]%x ", i,uc_str[i]);
}
printf("\n------------------\n", __LINE__);
int len = strlen((char*)uc_str);
convert_uchar_to_char(uc_str,c_strxxx,len);
printf("\n[%d]--------------convert_uchar_to_char->c_strxxx:%s----------\n", __LINE__,c_strxxx);
return 0;
}
windows 下验证
PS C:\Users\dell\Desktop\code_test> gcc .\uchar_to_char_csdn.c
PS C:\Users\dell\Desktop\code_test> .\a.exe
[34]c_len:64
[57]--------------convert_char_to_uchar->uc_str:nWBUqDWDmO5ZU2J0pSkF66HwoA0vuvUTK6zPotvpycLKV1QxJ2c4sKRot5DAeXdx----------
[0]6e [1]57 [2]42 [3]55 [4]71 [5]44 [6]57 [7]44 [8]6d [9]4f [10]35 [11]5a [12]55 [13]32 [14]4a [15]30 [16]70 [17]53 [18]6b [19]46 [20]36 [21]36 [22]48 [23]77 [24]6f [25]41 [26]30 [27]76 [28]75 [29]76 [30]55 [31]54 [32]4b [33]36 [34]7a [35]50 [36]6f [37]74 [38]76 [39]70 [40]79 [41]63 [42]4c [43]4b [44]56 [45]31 [46]51 [47]78 [48]4a [49]32 [50]63 [51]34 [52]73 [53]4b [54]52 [55]6f [56]74 [57]35 [58]44 [59]41 [60]65 [61]58 [62]64 [63]78
------------------
[69]--------------convert_uchar_to_char->c_strxxx:nWBUqDWDmO5ZU2J0pSkF66HwoA0vuvUTK6zPotvpycLKV1QxJ2c4sKRot5DAeXdx----------