首页
社区
课程
招聘
[讨论]如何检测一个字符中 是否有乱码 VC++ 代码
发表于: 2008-7-8 12:20 7346

[讨论]如何检测一个字符中 是否有乱码 VC++ 代码

2008-7-8 12:20
7346
下面这个函数是我自己想的. 似乎不完美
主要采取的是对字符从左向右 看他的ASII 值是否在一个可以显示的字符中
也就是是不是在 0 - 129 间
不过实际运用中.却不起作用!

可能是 CString 的 getai没用好吧!!或者是其它问题.

各位有没有比较好用的判定非法字符的函数?

bool check(CString str)
{
        if (str.IsEmpty())
        {
                return FALSE;
        }
       
        if (str.GetLength()>15 ) return 0;
           char ch;
        for (int i=0;i<str.GetLength();i++)
        {
                ch=str.GetAt(i);
                
                if(ch<0 || ch>129)
                {
                        return FALSE;
                }
        }   
        return TRUE;
}

[课程]Linux pwn 探索篇!

收藏
免费 0
支持
分享
最新回复 (3)
雪    币: 8149
活跃值: (1875)
能力值: ( LV8,RANK:122 )
在线值:
发帖
回帖
粉丝
2
你用无符号Char好点吧

这个好像不能对汉字处理吧
2008-7-8 12:57
0
雪    币: 249
活跃值: (10)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
3
汉字确实麻烦...
2008-7-8 13:52
0
雪    币: 253
活跃值: (27)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
4
下面的代码只可以处理ascii或unicode 西文字符
摘自PEInfo模拟版V0.03
我是这样处理的:

int j=0;
byte *pTempByte = pByte;
while( !( *pTempByte==NULL && *(pTempByte+1)==NULL ) )
{
	pTempByte++;
}
j = pTempByte - pByte;
if( j==0 )//二进制
{
	SetRelcationSectionItemDetailData(i,pByte);
}
else
{
	if( j%2==1 )//为UNICODE凑为字节双数
		j++;
	if( IsTextUnicode(pByte,j,NULL) )
	{
		UINT strSize = wcslen((LPWSTR)pByte);

		LPSTR pAnsiStr = UnicodeToAnsi((LPWSTR)pByte);
		if( pAnsiStr )
		{
			if( ByteIsCanView((wchar_t *)pByte) )
			{
				if( ByteIsCanView((byte *)pAnsiStr) )//首字节在此范围内才显示ascii(只支持西文)
				{
					s.Format("%s (Unicode string) %dbytes",pAnsiStr,strSize*2);
					pRelcationSectionItemList->SetItemText(i,5,s);
					TRACE("%s\n",s);
					delete pAnsiStr;
				}
			}
			else
			{
				SetRelcationSectionItemDetailData(i,pByte);
			}
		}
		else
		{
			SetRelcationSectionItemDetailData(i,pByte);
		}

	}
	else
	{
		if( ByteIsCanView(pByte) )//首字节在此范围内才显示ascii(只支持西文)
		{
			s.Format("%s (string) %dbytes",pByte,strlen((char*)pByte));
			pRelcationSectionItemList->SetItemText(i,5,s);
			TRACE("%s\n",s);
		}
		else
		{
			SetRelcationSectionItemDetailData(i,pByte);
		}
	}
}

LPSTR UnicodeToAnsi(LPWSTR lpszWideStr)
{
	BOOL bUsed;
	LPSTR lpAnsiStr;
	if (lpszWideStr)
	{
		int len = WideCharToMultiByte(CP_ACP, 0, lpszWideStr, -1, NULL, 0,NULL, &bUsed);
		if (len == 0)
			return NULL;
		lpAnsiStr = new char[len + 1];
		if (lpAnsiStr == NULL)
			return NULL;
		if (WideCharToMultiByte(CP_ACP, 0, lpszWideStr, -1, lpAnsiStr, len,NULL, &bUsed))
			return lpAnsiStr;
	}
	return NULL;
}

template<class T>
bool ByteIsCanView(T *pStr)
{
	if( *pStr==0 )
		return false;
	while(*pStr)
	{
		if( !((*pStr>=T(0x20)) && (*pStr<=T(0x7E))) )
			return false;
		pStr++;
	}
	return true;
}

void CPE_Relocation::SetRelcationSectionItemDetailData(int index,byte *pByte)
{
	CString str;
	str.Format("%02X %02X %02X %02X %02X %02X %02X %02X %02X %02X",
		*pByte,*(pByte+1),*(pByte+2),*(pByte+3),*(pByte+4),*(pByte+5),
		*(pByte+6),*(pByte+7),*(pByte+8),*(pByte+9));
	pRelcationSectionItemList->SetItemText(index,5,str);
	//CListCtrl
}

以下是PEInfo模拟版重定位表字符显示示例
LordPE v1.4只显示10个字符(ascii or unicode)
上传的附件:
2008-7-13 17:49
0
游客
登录 | 注册 方可回帖
返回
//