自己的一个sscanf的用法
如何把char 数组中的2个字节的内存 "3200",算出10进制int值是多少
//char buffer[25] = {0};
//int iIndex = 0;
//buffer[iIndex++] = 0xff;
//buffer[iIndex++] = 0xff;
//buffer[iIndex++] = 0x32;
//buffer[iIndex++] = 0x00;
//buffer[iIndex++] = 0x20;
//for (int i = 5;i < 25;++i)
//{
// buffer[i] = i;
//}
Way1:sprintf(buffer,"%x%x",unsignedCha32,unsignedCha00);//buffer is "3200"
int iValue = 0;sscanf(buffetr,"%x",&iValue);//iValue = 50;
Way2:
//unsigned short *pint = (unsigned short *)buffer;
//unsigned short iNum = pint[1];
//看看内存布局,windows是低字节在前,高字节在后
4 修改低高字节问题 如何全用联合体?sscanf and unsinged ushort *pint
char g_bufferRev[1024] = {0};
char g_bufferRead[1024] = {0};
char g_bufferFlag[4] = {0};
sprintf(g_bufferFlag,"%c%c",255,255);
int actualReadLen = 8;
sprintf(g_bufferRead,"%c%c%c%c%c%c%c%c",255,255,32,0,3,97,98,99);
strncat(g_bufferRev,g_bufferRead,actualReadLen);
strncat(g_bufferRev,g_bufferRead,actualReadLen);
这段代码对吗?
接收二进制 不要用strcat strstr
ff ff 02 26 fa 30 31 32 00 f3 ff ff 30 00 3c 1c 64 65
ff ff 00 32 fa 00 00 00 b0 f5 ff ff 30 00 3c 1e 00 00 00 00 00 00 00 00 00 00 00 00 00 00
原文出处:
点击打开链接
今天看到一个程序中sscanf() 的用法,比较有效,以前从来没有注意到,然后就查了一个它的帮助手册,其实以前也看过,只是大概浏览了一下,没有细细口味。 // gcc -o sscanTest sscanTest.c #include #include int main(int argc, char **argv) { char sentence []="Rudolph is 12 years old"; char str [20]; char str2 [20]; char buf[128], buf2[128]; int i; int a, b, c; char sztime1[16] = "", sztime2[16] = ""; memset(buf, 0, 128); sscanf (sentence,"%s %*s %d %s",str,&i, str2); printf ("result100= %s -> %d -> %s\n",str, i, str2); memset(buf, 0, 128); sscanf("123456 ", "%3s", buf); printf("result101= %s\n", buf); memset(buf, 0, 128); sscanf("123456 abcdedf", "%[^ ]", buf); printf("result102= %s\n", buf); memset(buf, 0, 128); sscanf("123456abWWQcdedfBCDEF", "%*[1-9a-z]%s", buf); printf("result103= %s\n", buf); memset(buf, 0, 128); sscanf("123456abWWQcdedfBCDEF", "%[1-9a-z]", buf); printf("result1031= %s\n", buf); memset(buf, 0, 128); memset(buf2, 0, 128); sscanf("bC123456abcdedfBCDEF", "%*[^A-Z]%c%*[0-9]%s", buf, buf2); printf("result104= %s, %s\n", buf, buf2); memset(buf, 0, 128); memset(buf2, 0, 128); //sscanf("bCDE123456abcdedfBCDEF", "%[a-z]%*[A-Z]%[^A-Z]", buf, buf2); sscanf("bCDE123456abcdedfBCDEF", "%*[A-Za-z]%[^A-Z]", buf, buf2); printf("result1041= %s , %s\n", buf, buf2); memset(buf, 0, 128); sscanf("iios/12DDabcWDFF@122", "%*[^/]/%[^@]", buf); printf("result105= %s\n", buf); memset(buf, 0, 128); sscanf("hello,new world", "%*s%s", buf); printf("result106= %s\n", buf); // String of characters. This will read subsequent characters until a whitespace is found // (whitespace characters are considered to be blank, newline and tab). memset(buf, 0, 128); sscanf("hello, new world", "%*s%s", buf); printf("result1061= %s\n", buf); sscanf("2006:03:18 - 2006:04:18", "%s - %s", sztime1, sztime2); printf("result107= %s , %s\n", sztime1, sztime2); memset(sztime1, 0, 16); memset(sztime2, 0, 16); sscanf("2006:03:18 - 2006:04:18", "%[0-9,:] - %[0-9,:]", sztime1, sztime2); printf("result1071= %s , %s\n", sztime1, sztime2); return 0; } 以上测试结果显示为: $ sscanTest.exe result100= Rudolph -> 12 -> years result101= 123 result102= 123456 result103= WWQcdedfBCDEF result1031= 123456ab result104= C, abcdedfBCDEF result1041= 123456abcdedf , result105= 12DDabc/WDFF result106= world result1061= new result107= 2006:03:18 , 2006:04:18 result1071= 2006:03:18 , 2006:04:18 参考网址对const char* s = iios/12DDWDFF@122; sscanf( s, "%*[^/]/%[^@]", buf ); 的匹配说明,个人感觉说明不太明确(也许是个人的理解不到位吧) 以至我写了上面的练习来体会sscanf表达式的用法 以下是个人理解,有不清楚或错误的地方可指正: 此表达式:"%*[^/]/%[^@]" 它分为两部分,1。需要过滤的部分(也就是去掉部分),2。需要保留给返回值部分 如何确定表达式拆分成几部分,则由%来确定 %*[^/]/为过滤部分, %*[^/]只是过滤了"iios",再加上/,就过滤了"iios/"(参考(*)说明) %[^@]为返回值部分, 表示匹配到不是@字符为止的字符串,由于它是按char一个一个来匹配,一旦中止条件成立,就不再继续往下进行,也就是贪婪匹配结束 有关表达式可参考perl的,虽然sscanf的匹配模式没有正则表达式那么强大,但在一些场所还是很有效的!