刚开始工作接了公司一个项目,一个报文处理工具,需求是把报文附带着中文显示出来,所以想到用QString来实现,效果如下EB 90 EB 90 EB(报文头) 90 01 61
报文是以char*存储的,所以我先完成从char*到QString的转换,代码如下
char* m_pData;
memcpy(m_pData, pData, nLength);
m_nLength = nLength;
//char存储到QString里
for (int i = 0; i < m_nLength; i++)
{
bool ok;
QString m_tmp = QString::number(*m_pData,16);
//接收字符为0x00,变字符串为00
if (m_tmp.toInt(&ok,10) == 0)
{
m_tmp = ("00");
}
//接收字符为0x04,0x07等,补足0
if ((m_tmp.toInt(&ok,10) < 10) && (m_tmp.toInt(&ok,10) > 0))
{
m_tmp = m_tmp.insert(0, "0");
}
m_exchange.append(m_tmp);
m_exchange.append(" ");
m_pData = m_pData + 1;
m_tmp.clear();
}
当是全部是数字的时候转换都能成功,比如*m_pData是104,那么转换出来就是"68",也就是0x68,*m_pData为0,经过处理就是"00",不足10的补足,比如是4,那么就是"04",但是现在我的问题是,如果是16进制带字母的该如何转换呢,比如0xEB,希望转换成"EB",但是QString里没找到toHex函数。。。btw,我是Qt 4.8.0的版本,求问各位大牛有什么好办法么?
------解决方案--------------------
一个古老的函数
str.spritnf("%.2X",iByte);
------解决方案--------------------
sprintf(m_tmp, "%2X",(unsigned char)*m_pData)
------解决方案--------------------
char* m_pData;
memcpy(m_pData, pData, nLength);
你没有为m_pData分配资源就copy过去了?
既然都用c++了,为何不干脆使用std::string?
或者更直接一点,把文件存到QString里,省下转换地开销
QString有提供一个叫toInt地函数
QString data("104");
qDebug()<<data.toInt(nullptr, 16);
nullptr为c++11才提供地关键字
编译器不支援地话用0就好
不要用NULL,c++可没有规定NULL一定等于0