摘要:
通过编写一个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。
Linux shell字符串模式匹配运算符:http://www.linuxdiyf.com/linux/14019.html
[ubuntu]在vim中查找指定字符串和指定文件:http://www.linuxdiyf.com/linux/13655.html
Linux shell字符串截取与拼接:http://www.linuxdiyf.com/linux/9890.html
UNIX/Linux下的vi/vim编辑器快速替换字符串:http://www.linuxdiyf.com/linux/10900.html
Linux下查找字符串命令:http://www.linuxdiyf.com/linux/4135.html