读取身份证证件信息时,设备返回了dc 59 89 83 89 83 20 00 20 00 20 00 20 00 20 00 20 00 20 00 20 00 20 00 20 00 20 00 20 00 这样的信息;
所以我先把十六进制数据转为十六进制字符串:
int i;
unsigned char inChar, hi, lo;
QString s;
for (i = 0; i < len; i++) {
inChar = in[i];
hi = (inChar & 0xF0) >> 4;
if (hi > 9) {
hi = 'A' + (hi - 0x0A);
} else {
hi += 0x30;
}
s.append(hi);
lo = inChar & 0x0F;
if (lo > 9) {
lo = 'A' + (lo - 0x0A);
} else
{
lo += 0x30;
}
s.append(lo);
// s.append(0x20); // 空格
}
return s;
然后做转码:4f60597d200020002000200020002000200020002000200020002000转成对应名字“你好"
traceLogCom.outPutMsg(QtDebugMsg, qName);
QByteArray encodedString; // store char code
// 1.互换汉字两个字节位置
int n = qName.length();
for (int m = 0; m < n; m += 4) {
encodedString.append("\\u");
encodedString.append(qName.mid(m + 2, 2));
encodedString.append(qName.mid(m, 2));
}
traceLogCom.outPutMsg(QtDebugMsg, "转换:");
QString filename = QString::fromLatin1(encodedString);
traceLogCom.outPutMsg(QtDebugMsg, filename);
// 找到每个汉字unicode编码并转为int进行替换,删掉转换后的\u
do {
int idx = filename.indexOf("\\u");
QString strHex = filename.mid(idx, 6);
strHex = strHex.replace("\\u", QString());
int nHex = strHex.toInt(0, 16);
filename.replace(idx, 6, QChar(nHex));
} while (filename.indexOf("\\u") != -1);
traceLogCom.outPutMsg(QtDebugMsg, filename);