- 论坛徽章:
- 0
|
[quote]原帖由 [i]新手上路2世[/i] 于 2006-10-30 13:02 发表
我有一个字符串
ccc=aaaddd 0x01 www=aadfad 0x01 bbb=adfadf
有两个分隔符一个是=
一个是0x01
我希望能够按照0x01分解字符串后再按照=号分解。
分一次比较简单,但是再分第二次就有点难度。 接口方面也有 ... [/quote]
我再上个作上个产品中也遇到需要自己解析内存的情况,所以自己写了一个在一段内存中取一部分的函数,用法给你贴出来了,自己改改看看吧
/*------------------------------------------------------------------------------
NAME: memchop
SRC: libfoxsys_strings.c
INCLUDE: sys/sys_api.h
LIBS: libfoxsys.a libfoxsys.so
PROTOTYPE: void *
memchop(const void *start, int slen, const void *end, int elen,\
const void *src,int dlen,int *rlen, int *ridx)
ARGUMENTS: start: start buffer to compare with
slen: length of start buffer
end: end buffer to compare with
elen: length of end buffer
src: source buffer to search on
dlen: length of source buffer
rlen: return length of matched
ridx: rear index.
RETURN VALUE: return pointer to match result if success
return NULL on error.
check the rlen value:
rlen=-1: src, start,end is NULL
rlen=-2: dlen < 1
rlen=-3: start not found
rlen=-4: end not found
rlen=-4: wrong seqence of start and end
DESCRIPTION: to intercept buffer beging with start end with end in src, then
return its position. and store length and rindex of the match
result to vars point by rlen, and ridx respectively.
for example: search start with "<test>", end with "</test>" in
"<test>hello world</test>juckdata", reslult is pointer to 'h',
and rlen is 11(length of 'hello world'), ridx is 24 (idx of j).
BUGS:
SEE ALSO: memstr
memchop(const void *start, int slen, const void *end, int elen,
const void *src,int dlen,int *rlen, int *ridx)
{
unsigned char *ptr_s, *ptr_e;
int ret;
if ((! src) || (! start) || (! end) )
{
* rlen = -1;
return NULL;
}
if (dlen < 1)
{
* rlen = -2;
return NULL;
}
if ((ptr_s = (unsigned char *)memstr((char *)src, \
(char *)start, slen, dlen)) == NULL)
{
* rlen = -3;
return NULL;
}
if ((ptr_e = (unsigned char *)memstr((char *)src, \
(char *)end, elen, dlen)) == NULL)
{
* rlen = -4 ;
return NULL;
}
ret = ptr_e - ptr_s ;
ret = ret - strlen(start);
if ((ret = (ptr_e - ptr_s -strlen(start) )) < 0)
{
* rlen = -5 ;
return NULL;
}
if (rlen)
*rlen = ret ;
if (ridx)
*ridx = (ptr_e - ptr_s) + strlen(end) + \
(ptr_s - (unsigned char *) src) ;
return ptr_s+strlen(start) ;
}
[[i] 本帖最后由 picobsd 于 2006-10-30 17:38 编辑 [/i]] |
|