string转换成unsiged char
我有一个文件,里面存的是string类型的文本,没行的内容如:“a3275d7f”,“7A4DFF90”,实际上是十六进制数的字符串表示。
我想每读两位就将其转换成一个unsiged char格式。也就是说,将其真正的转换成16进制数。
如何实现?
新人,虚心求教,感谢感谢!请给比较完整的代码。
[解决办法]
读取格式应该可以设置,使用fscanf。
int fscanf(FILE *stream, char *format,[argument...]);
http://baike.baidu.com/view/656694.html?wtp=tt
格式字符说明
%x %X: 读入十六进制整数.
[解决办法]
unsigned int ascvnum(char cp){ if (cp >= 'a') { return cp - 'a' + 10; } if (cp >= 'A') { return cp - 'A' + 10; } return cp - '0';}unsigned int strtoint(const char* szval){ char cp = 0; unsigned int uiret = 0; while (cp = *szval++) { uiret *= 16; uiret += ascvnum(cp); } return uiret;}int main(){ printf("%08x\n",strtoint("7A4DFF90")); getchar(); return 0;}
[解决办法]
#include "stdafx.h"#include <Windows.h>#include <iostream>#include <string>using namespace std;int main(int argc, char* argv[]){ string str[] = { "a3275d7f", "7A4DFF90" }; char buf[3] = {0}; BYTE bData = 0; int nIndex = 0; for(int i=0; i<sizeof(str)/sizeof(str[0]); i++) { nIndex = 0; const char* pTmp = str[i].c_str(); for(int j=0; j<strlen(pTmp); j++) { if(2 == nIndex) { bData = strtoul(buf, NULL, 16); printf("0x%x ", bData); nIndex = 0; } buf[nIndex++] = pTmp[j]; } bData = strtoul(buf, NULL, 16); printf("0x%x\n", bData); } return 0;}
[解决办法]
#include <iostream>#include <fstream>#include <string>#include <vector>using namespace std;/**@brief text read and write */const int iRule = 2;const int MaxCount = 100;//#define MyStr vector<string>//#define MyNum vector<unsigned char>typedef vector<string> MyStr;typedef vector<unsigned char> MyNum;class CreadAndWrite{public: CreadAndWrite() {} ~CreadAndWrite() {} bool readTxAndSetV(string FilePath); string*& splitstr(string str); void ConvertToNum(); void printValue();private: MyStr m_mystr; MyNum m_mynum;};/**按每2个字节进行截取。返回数组 */string*& CreadAndWrite::splitstr(string str){ cout<<"enter function splitstr "<<endl; string *returnstr = new string[MaxCount]; cout<<"截取的字符串的长度为"<<str.length()<<endl; int count = 0; for(int i = 0; i <= str.length()-2; i+=2) { returnstr[count] = str.substr(i,iRule); cout<<returnstr[count]<<endl; ++count; } cout<<"exit function splitstr "<<endl; return returnstr;}bool CreadAndWrite::readTxAndSetV(string FilePath){ ifstream in(FilePath.c_str()); if(!in) { return false; } string readline; while(getline(in,readline)) { m_mystr.push_back(readline); cout<<readline<<endl; } return true;}void CreadAndWrite::ConvertToNum(){ for(MyStr::iterator iter = m_mystr.begin();iter != m_mystr.end(); iter++) { cout<<"enter funtion ConvertToNum"<<endl; string stmp = *iter; string* ptmp = splitstr(stmp); cout<<ptmp[0]<<endl; cout<<ptmp[1]<<endl; cout<<ptmp[2]<<endl; cout<<ptmp[3]<<endl; cout<<"start push_back string and print it"<<endl; for(int i = 0; i < stmp.length() / 2; i++) { //m_mynum.push_back(atoi( (ptmp[i].c_str()) )); m_mynum.push_back( strtoul(ptmp[i].c_str(), NULL, 16) ); cout<<(ptmp[i].c_str())<<endl; } cout<<"end push_back string and print it"<<endl; delete []ptmp; } cout<<"exit function ConvertToNum "<<endl; }void CreadAndWrite::printValue(){ cout<<"转化的十六进制有"<<m_mynum.size()<<endl; cout<<"转化成功的字符为"<<endl; for(MyNum::iterator iter = m_mynum.begin();iter != m_mynum.end(); iter++) { //cout<<*iter<<endl; printf("0x%x\n", *iter); }}int main(){ string FilePath= "context.txt"; CreadAndWrite _caw; if(!_caw.readTxAndSetV(FilePath)) { cout<<"文件不存在!"<<endl; return 1; } _caw.ConvertToNum(); _caw.printValue(); return 0;}