摘要:
通过编写一个C++程序,并用其处理汇编源文件,使汇编源文件中的被特别标识符标识的Ansi字符串转化为Unicode字符串。
源程序:
- //String to Unicode String (for assembler)
- //可以把汇编源文件(ANSI编码)中的
- //;Unicode Name "12我门3"
- //转化为
- //;Unicode Name "12我门3"
- //Name dw 00031h,00032h,06211h,095E8h,00033h,0 ;EndUni
- //注意:
- //对于
- //;Unicode Name "12我门3"
- //??????????????????????????;EndUni
- //也将转化为
- //;Unicode Name "12我门3"
- //Name dw 00031h,00032h,06211h,095E8h,00033h,0 ;EndUni
- //“12我门3” ANSI编码为3132CED2C3C533 Unicode编码为00310032621195E80033
- //"12我门3" 转化为 00031h,00032h,06211h,095E8h,00033h
- //-------------------------------------------------------------------------------------------------
- #include<iostream>
- #include<iomanip>
- #include<fstream>
- #include<sstream>
- #include<string>
- #include<windows.h>
- const int maxLineChar=2048;
- const int maxByte=1023;
- bool ConvStrAndInput(std::string &strtmp,std::ostream & fout)
- {//实现转换strtmp与输出到fout
- UINT CodePage=CP_ACP;
- DWORD dwFlags=NULL;
- wchar_t WideCharStr[maxByte+1];//MultiByteToWideChar函数的输出字符串
- if (strtmp.length()>maxByte) {return false;};
- //MultiByteToWideChar是主要干活的函数
- if (!MultiByteToWideChar(CodePage,dwFlags,strtmp.c_str(),-1,WideCharStr,maxByte)) {return false;};
- //设置fout流
- int i=0;fout<<std::setfill('0')<<std::hex;
- while ((__int16)WideCharStr[i]!=0)
- {//把获得的输出转换为汇编中的定义形式
- fout<<'0' //确保数据的第一个字符为数字
- <<std::setw(2)<<int(*((unsigned char *)(WideCharStr+i)+1)) //由于内存高低位的反向,
- <<std::setw(2)<<int(*((unsigned char *)(WideCharStr+i))) //所以这里也反向
- <<"h,"; //汇编中16进制数定义所需的
- i++;
- };
- fout<<"0";
- return true;
- };
- int main(const int argc,const char *argv[])
- {
- // 准备好输入输出文件
- if (argc!=2) {std::cerr<<"参数错误!/nUsage:ConvStr input_file./n";system("pause");exit(1);};
- std::ifstream fi(argv[1]);
- std::ofstream fo("Conv.$$");
- // 中转字符串,与字符
- std::istringstream si;
- std::ostringstream so;
- std::string strLine;
- std::string strTemp2;
- std::string strModelB(";Unicode");
- std::string strModelE(";EndUni");
- // 读取-判断(转换)-输出
- while (std::getline(fi,strLine))
- {
- so.str("");si.clear();
- if (strLine.length()<8) {fo<<strLine<<'/n';continue;}
- if (strLine.substr(strLine.length()-7,7)==strModelE) continue;
- if (strLine[0]!=';'||strLine[1]!='U') {fo<<strLine<<'/n';continue;};
- si.str(strLine);si>>strTemp2;
- if (strTemp2!=strModelB) {fo<<strLine<<'/n';continue;};
- if(!(si>>strTemp2 && strTemp2!=strModelB))
- {std::cerr<<"定义格式错误!此行未改变:/""<<strLine<<"/"/n";fo<<strLine<<'/n';continue;};
- so<<strTemp2<<"/tdw/t";
- std::getline(si,strTemp2,'"');std::getline(si,strTemp2,'"');
- if(!si)
- {std::cerr<<"定义格式错误!此行未改变:/""<<strLine<<"/"/n";fo<<strLine<<'/n';continue;};
- if (!ConvStrAndInput(strTemp2,so))
- {std::cerr<<"待转换的字符串错误/nError String:"<<strTemp2;system("pause");exit(1);};
- so<<' '<<strModelE;
- fo<<strLine<<'/n'<<so.str()<<'/n';
- };
- fi.close();fo.close();
- strLine.assign("del ");strLine.append(argv[1]);
- strTemp2.assign("rename Conv.$$ ");strTemp2.append(argv[1]);
- system(strLine.c_str());
- system(strTemp2.c_str());
- return(0);
- }
备注:编译环境为VS2008