• 8552阅读
  • 11回复

[提问]求将图片的数据转成同样值字符串的思路 [复制链接]

上一主题 下一主题
离线纵刀少年
 

只看楼主 倒序阅读 楼主  发表于: 2014-11-04
意思就是,假如图片一段数据是:0x10,0x22,0x33,0x55这样,然后要将其转换成字符串"0x100x220x330x55",虽然自己也感觉很别扭。
离线纵刀少年

只看该作者 1楼 发表于: 2014-11-04
这样做的原因是某个GPRS模块发送图片数据遇到某个符号的时候会认为这是数据的结尾,因而无法保证图片数据是否包含该符号
离线uidab

只看该作者 2楼 发表于: 2014-11-04
QString 就可以啊。
有时候为了工作直接获得答案,而我却失去了思考的乐趣!


飘啊飘,何时能安居!
离线纵刀少年

只看该作者 3楼 发表于: 2014-11-04
回 uidab 的帖子
uidab:QString 就可以啊。 (2014-11-04 11:05) 

QString有相关函数?一个一个字符用QString::number处理么?.....就是别人传过来的是字符串的数据,我要转换回相同数值的二进制数写入QByteArray
离线纵刀少年

只看该作者 4楼 发表于: 2014-11-04
重新说明,假设要发送的图片数据是0x1a,0x2b,则实际是发送字符串"1a2b"这样。
离线realfan

只看该作者 5楼 发表于: 2014-11-04
也可以直接用QByteArray::toHex和QByteArray::fromHex来回转换
离线realfan

只看该作者 6楼 发表于: 2014-11-04
如果想自己写转换代码,我这里写过一个,供你参考
  1. inline unsigned char HexCharToNibble(const char ch)
  2. {
  3.     if (ch >= '0' && ch <= '9')
  4.         return (unsigned char)(ch - '0');
  5.     else if (ch >= 'a' && ch <= 'f')
  6.         return (unsigned char)((ch - 'a') + 10);
  7.     else if (ch >= 'A' && ch <= 'F')
  8.         return (unsigned char)((ch - 'A') + 10);
  9.     else
  10.         return 0xFF;
  11. }
  12. inline char NibbleToHexChar(const char b)
  13. {
  14.     if (b >= 0 && b <= 9)
  15.         return (char)b + '0';
  16.     else if (b >= 0x0a && b <= 0x0f)
  17.         return (char)((b - 10)+ 'A');
  18.     else
  19.         return '?';
  20. }
  21. unsigned long ByteDataToHexString(const unsigned char * pinByteData, //source binary data ptr
  22.                                   const unsigned long ulDataSize,    //data length
  23.                                   char * const szRetHex,             //result buffer
  24.                                   unsigned long ulMaxLen)            //buffer length
  25. {
  26.     if(0 == pinByteData || 0 == szRetHex) return 0;
  27.     if(ulMaxLen <= ulDataSize<<1 ) return 0;
  28.     for (unsigned long i = 0; i < ulDataSize; ++i)
  29.     {
  30.         unsigned char bTmp = *pinByteData++;
  31.         char chTmp = NibbleToHexChar(bTmp >> 4);
  32.         szRetHex[i<<1] = chTmp;
  33.         chTmp = NibbleToHexChar(bTmp & 0x0F);
  34.         szRetHex[(i<<1) + 1] = chTmp;
  35.     }
  36.     szRetHex[ulDataSize<<1] = 0;
  37.     return ulDataSize<<1;
  38. }
  39. unsigned long HexStringToByteData(const char * szHex,  //HEX string  eg: 7F8D98...
  40.                            unsigned char * const pRetByteData,  //result buffer
  41.                            const unsigned long ulMaxSize)  //buffer length
  42. {
  43.     if(0 == szHex || 0 == pRetByteData) return 0;
  44.     unsigned long ulLen = strlen(szHex);
  45.     if(ulLen < 2 || (ulLen & 0x01)> 0 ) return 0;
  46.     unsigned long iSize = ulLen >> 1;
  47.     if(iSize > ulMaxSize) return 0;
  48.     for (unsigned long i = 0; i < iSize; ++i)
  49.     {
  50.         unsigned char bTmpH = HexCharToNibble(szHex[i<<1]);
  51.         unsigned char bTmpL = HexCharToNibble(szHex[(i<<1) + 1]);
  52.         pRetByteData[i] = (bTmpH << 4) | bTmpL;
  53.     }
  54.     return iSize;
  55. }

离线纵刀少年

只看该作者 7楼 发表于: 2014-11-04
回 realfan 的帖子
realfan:如果想自己写转换代码,我这里写过一个,供你参考
inline unsigned char HexCharToNibble(const char ch)
{
    if (ch >= '0' && ch <= '9')
        return (unsigned char)(ch - & .. (2014-11-04 12:09) 

谢谢,应该就是要找你这样的了
离线纵刀少年

只看该作者 8楼 发表于: 2014-11-04
回 realfan 的帖子
realfan:也可以直接用QByteArray::toHex和QByteArray::fromHex来回转换 (2014-11-04 12:01) 

噢!QString(buffer.data().toHex())似乎可以直接达到效果。
离线roywillow

只看该作者 9楼 发表于: 2014-11-04
如果真是1a2b这种字符串的话用QByteArray::fromHex()最方便了
专业维修核潜艇,回收二手航母、二手航天飞机,大修核反应堆,拆洗导弹发动机更换机油,无人侦察机手动挡改自动,航天飞机保养换三滤,飞碟外太空年检 ,各型号导弹加装迎宾踏板,高空作业擦洗卫星表面除尘、打蜡及抛光,东风全系列巡航导弹。并提供原子对撞机。量大从优,有正规发票。
离线纵刀少年

只看该作者 10楼 发表于: 2014-11-05
回 roywillow 的帖子
roywillow:如果真是1a2b这种字符串的话用QByteArray::fromHex()最方便了 (2014-11-04 18:08) 

是啊,我没想到它就是按字面值翻译,我还以为会经过转换
离线wisteria

只看该作者 11楼 发表于: 2015-01-22
好牛,又学到点东西了。
Winter in my heart
快速回复
限100 字节
 
上一个 下一个