串口、TCP、UDP傳輸中文字符時,先將字符串轉內碼。客戶端接收到數據后,將內碼轉為字符串就OK了
QByteArray CommonFunction::strToInterCode(constQString &str)//字符串轉內碼
{
QString strName = str.toLocal8Bit();
QByteArray code;
code.append (strName);
while(code.count()<8)
{
code.append (QByteArray::fromHex ("20"));
}
qDebug ()<<"string to intercode"<<QObject::tr("%1").arg (code.toHex ().data ());
return code;
}
//內碼轉字符串,要求為雙字節數
QString CommonFunction::interCodeToStr(const QByteArray &data)
{
QString str;
QByteArray temp;
for(int i= 0;i<data.length();i+=2)
{
if(!(data[i] == 0x20 && data[i+1] == 0x20))
{
temp.append (data[i]);
temp.append (data[i+1]);
}
}
str = QString::fromLocal8Bit(temp);
qDebug ()<< "intercode To string :"<<str;
return str;
}
// 字符串轉Unicode碼
QByteArray CommonFunction::strToUniCode(const QString &str)
{
// 這里傳來的字符串一定要加tr,main函數里可以加 QTextCodec::setCodecForTr(QTextCodec::codecForLocale());
QString stt = QObject::tr("%1").arg (str);
QByteArray data;
const QChar *q;
QChar qtmp;
int num;
q=stt.unicode();
int len=stt.count();
for(int i=0;i<len;i++)
{
qtmp =(QChar)*q++;
num= qtmp.unicode();
quint8 hi = (quint8)(num >> 8);
quint8 lo = (quint8)(num);
data.append (hi);
data.append (lo);
}
while(data.count () <8)
{
data.append (QByteArray::fromHex ("20"));
}
qDebug ()<<"string to unicode :"<<QObject::tr("%1").arg (data.toHex ().data ());
return data;
}
//Unicode碼轉字符串
QString CommonFunction::uniCodeToStr(const QByteArray &data)
{
QByteArray data_1;
for(int i= 0;i<data.length ();i+=2)
{
if(!(data[i] == 0x20 && data[i+1] == 0x20))
{
data_1.append (data[i]);
data_1.append (data[i+1]);
}
}
QString str = data_1.toHex ().data ();
int temp[400];
QChar qchar[100];
QString strOut;
bool ok;
int count=str.count();
int len=count/4;
for(int i=0;i<count;i+=4)
{
temp[i]=str.mid(i,4).toInt(&ok,16);//每四位轉化為16進制整型
qchar[i/4]=temp[i];
QString str0(qchar, len);
strOut=str0;
}
qDebug ()<<"unicode to string:"<<strOut;
return strOut;
}
http://blog.csdn.net/liuguangzhou123/article/details/7478088