首页
社区
课程
招聘
[求助]字符串查找问题
发表于: 2014-7-24 13:47 4338

[求助]字符串查找问题

2014-7-24 13:47
4338
2C 21 7C B6 FE CA AE D2 BB CA C0 BC CD 33 C6 DA  ,!|二十一世纪

36 BA C5 BB CA B3 C7 C0 CF C2 E8 32 C2 A5 0D 0A  6号皇城

比如说我要查找“皇”字
在上面两个字符串中都会正确匹配,都匹配到了 BB CA ,但是明显是不正确的

_MemSearch	proc uses edx esi edi lpAddr:DWORD,lpSize:DWORD,lpBuff:DWORD,hLen:DWORD
	mov edx,lpAddr
	mov eax,lpSize
_loop:
	mov esi,edx
	mov edi,lpBuff
	mov ecx,hLen
	cld
	repz cmpsb
	.if ZERO?
		;xor eax,eax
		mov eax,edx
	.else
		.if eax>=hLen
			;or eax,-1
			inc edx
			dec eax
			jmp _loop
		.endif
		or eax,-1
	.endif
	ret
_MemSearch	endp

用到的函数strstr 和自己写的_MemSearch都一样,请问该如何解决这个问题?谢谢

[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
免费 0
支持
分享
最新回复 (5)
雪    币: 212
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
单字节和双字节在一起混淆  不怎么好办啊
2014-7-24 16:43
0
雪    币: 807
活跃值: (2353)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
汉字编码的2个字节都大于0x80,先定位到字符串中2个字节都大于0x80的位置,并且以双字节为单位向后搜索,每次搜索先判断这2个字节是否是汉字就可以解决问题了。
_MemSearch  proc uses edx esi edi lpAddr:DWORD,lpSize:DWORD,lpBuff:DWORD,hLen:DWORD
  mov esi,lpAddr
  mov eax,lpSize
_loop1:
  cmp eax,hLen
  jb _notfound
  mov dl,[esi]
  cmp dl,80h
  ja _loop2
  inc esi
  dec eax
  jmp short _loop1
_loop2:
  mov dl,[esi+1]
  cmp dl,80h
  ja _loop3
  add esi,2
  sub eax,2
  jmp short _loop1
_loop3:  
  mov edi,lpBuff
  mov ecx,hLen
  push esi
  pop edx
  cld
  repz cmpsb
  jnz _loop1
  push edx
  pop eax
  jmp short _exit
_notfound:
  or eax, -1
_exit:
  ret
_MemSearch  endp
2014-7-24 18:08
0
雪    币: 7048
活跃值: (3527)
能力值: ( LV12,RANK:340 )
在线值:
发帖
回帖
粉丝
4
这种问题其实很简单的,你定位到字符串开始地址,从第1个字节开始分析。
ASCII码的话,首个字节范围是0~0x7F,大于等于0x80就是2个字节,这样就不会出现字节混乱了。
比如你的那个
2C 21 7C B6 FE CA AE D2 BB CA C0 BC CD 33 C6 DA ,!|二十一世纪

分析的结果应该是:
2C 21 7C B6FE CAAE D2BB CAC0 BCCD 33 C6DA
2014-7-24 18:32
0
雪    币: 253
活跃值: (169)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
懂了,谢谢各位的解答
2014-7-24 19:11
0
雪    币: 719
活跃值: (777)
能力值: ( LV8,RANK:120 )
在线值:
发帖
回帖
粉丝
6
学习了一个好方法么么
2014-12-24 20:58
0
游客
登录 | 注册 方可回帖
返回
//