在开发协议这块时,为了寻找一个快速的8字节转换其它字节的方式,百度许久也没有一款简洁好用,并且在Qt中也好调用的方法,所以设计出了以下方法,该方法支持8字节转为任意指定的字节长度。
8字节转6字节
//判断ASCLL码转为数字需要减去的长度。
void conversionfunc(uchar data,int& val)
{
if ((unsigned int)data>96)
val = 56;
else
val = 48;
}
//8字节转为6字节,且以二进制的形式在字符串中记录,如12记录为“000001000010”,这样就将所有的数据以二进制数据存到字符串中了,我们需要哪段就取哪段。
void bit8Tobit6(QByteArray src,QString& desStr)
{
uchar* data = (uchar*)src.constData();
int val = 48;
for (int i = 0; i < src.size(); ++i) {
conversionfunc(data[i],val); //这个函数是判断字符从ASCLL码转为数字需要减去48还是56,一般情况下都是48,特殊协议除外。
int num = data[i]-val;
int len = 6;
QString ch = QString("%1").arg(num,len,2,QLatin1Char('0')); //转为二进制数据,且只取6位数
ch = ch.mid(ch.size() - len,len);
desStr.append(ch);
}
qDebug()<<desStr;
}
//字符串转为整形
int strToBinary(QString src,int startIndex,int len)
{
bool ok = false;
return src.mid(startIndex,len).toInt(&ok,2); //由于我们是以二进制的方式存到字符串中,所以转为整形时,需要以二进制的形式来转换
}
8字节转4字节
//判断ASCLL码转为数字需要减去的长度。
void conversionfunc(uchar data,int& val)
{
if ((unsigned int)data>96)
val = 56;
else
val = 48;
}
//8字节转为6字节,且以二进制的形式在字符串中记录,如12记录为“000001000010”,这样就将所有的数据以二进制数据存到字符串中了,我们需要哪段就取哪段。
void bit8Tobit2(QByteArray src,QString& desStr)
{
uchar* data = (uchar*)src.constData();
int val = 48;
for (int i = 0; i < src.size(); ++i) {
conversionfunc(data[i],val); //这个函数是判断字符从ASCLL码转为数字需要减去48还是56,一般情况下都是48,特殊协议除外。
int num = data[i]-val;
int len = 4;
QString ch = QString("%1").arg(num,len,2,QLatin1Char('0')); //转为二进制数据,且只取6位数
ch = ch.mid(ch.size() - len,len);
desStr.append(ch);
}
qDebug()<<desStr;
}
//字符串转为整形
int strToBinary(QString src,int startIndex,int len)
{
bool ok = false;
return src.mid(startIndex,len).toInt(&ok,2); //由于我们是以二进制的方式存到字符串中,所以转为整形时,需要以二进制的形式来转换
}
8字节转2字节
//判断ASCLL码转为数字需要减去的长度。
void conversionfunc(uchar data,int& val)
{
if ((unsigned int)data>96)
val = 56;
else
val = 48;
}
//8字节转为6字节,且以二进制的形式在字符串中记录,如12记录为“000001000010”,这样就将所有的数据以二进制数据存到字符串中了,我们需要哪段就取哪段。
void bit8Tobit2(QByteArray src,QString& desStr)
{
uchar* data = (uchar*)src.constData();
int val = 48;
for (int i = 0; i < src.size(); ++i) {
conversionfunc(data[i],val); //这个函数是判断字符从ASCLL码转为数字需要减去48还是56,一般情况下都是48,特殊协议除外。
int num = data[i]-val;
int len = 2;
QString ch = QString("%1").arg(num,len,2,QLatin1Char('0')); //转为二进制数据,且只取6位数
ch = ch.mid(ch.size() - len,len);
desStr.append(ch);
}
qDebug()<<desStr;
}
//字符串转为整形
int strToBinary(QString src,int startIndex,int len)
{
bool ok = false;
return src.mid(startIndex,len).toInt(&ok,2); //由于我们是以二进制的方式存到字符串中,所以转为整形时,需要以二进制的形式来转换
}
通过以上8转6、8转4、8转2可以看出这个方法通过更改len长度可以转任意小于8字节的。
实现思路:
8字节转为其它字节,将它以二进制的形式在字符串中记录,如12的二进制为0000000100000010,如果将它转为4字节,就是每个字节取末尾4个bit(小端情况下),然后记录到字符串中为“00010010”,这样就将所有的字节以二进制数据存到字符串中了,我们需要哪段就取哪段。