user-0 提问: 缓冲区读数据

回复:
user: user-0
content: 继续顶啊！！！！！！！

user: user-1
content: 引用 23 楼 u012889234 的回复:一直没有否认你的做法，，只是想换种方式。 去吧，相信总有一天你会换回来的。我等你。

user: user-0
content: 一直没有否认你的做法，，只是想换种方式。

user: user-0
content: 引用 21 楼 zhao4zhong1 的回复:struct _D {      short int2_0;      short int2_1;      char  int1_0;      int   int4_0;      char  int1_1;      unsigned char  str_0_len;//前面加unsigned使其取值范围0..255而不是-128..127      char  str_0[257]; } d[2];  有道理！！！！！

user: user-1
content: struct _D {      short int2_0;      short int2_1;      char  int1_0;      int   int4_0;      char  int1_1;      unsigned char  str_0_len;//前面加unsigned使其取值范围0..255而不是-128..127      char  str_0[257]; } d[2];

user: user-1
content: 引用 14 楼 u012889234 的回复:struct _D {     short int2_0;     short int2_1;     char  int1_0;     int   int4_0;     char  int1_1;     char  str_0_len;     char  str_0[257]; } d[2];  我的意思是在处理数据部分的时候不使用结构体。。 char  str_0[257]这个字符的长度有char  str_0_len来决定。 你现在给了257固定大小，但实际可能就用了3个或7个字节的空间。 pbuf = (char *)pbuf + sizeof(UcHdr); 现在pbuf指针已经指向了buf中的数据开始的地方。。 用指针偏移的办法解析后面的每项数据。。。 这是我的疑问？、？？ 我用257是因为前面用一个字节（0x00～0xFF）表示后续字符串的长度最大可表示0～255个或1～256个，再加上字符串末尾的'\0'共257个。 鬼知道或鬼才关心你过去、现在和未来实际最长用几个字符啊。

user: user-0
content: 顶！！我顶！！！！

user: user-0
content: c语言不就是这么吸引人的吗？

user: user-1
content: //使用动态分配 #include <stdio.h> #include <stdlib.h> #include <malloc.h> int i,L; char *p; void main() {     for (i=0;i<20000;i++) {         L=rand();         p=malloc(L);         if (NULL==p) {             printf("malloc error!\n");             continue;         }         memset(p,0,L);         free(p);     } } //不使用动态分配 #include <stdio.h> #include <stdlib.h> #include <memory.h> #define MAXLEN 30000 int i,L; char buf[MAXLEN]; char *p; void main() {     p=&buf[0];     for (i=0;i<20000;i++) {         L=rand();         if (L>MAXLEN) {             printf("L>MAXLEN==%d, ignore spilth.\n",MAXLEN);             L=MAXLEN;         }         memset(p,0,L);     } }  个人倾向不使用动态分配。

user: user-1
content: 引用 15 楼 u012889234 的回复:[quote=引用 13 楼 zhao4zhong1 的回复:] [quote=引用 8 楼 u012889234 的回复:] 我之前也是用结构体来解析数据部分的，但用户名和密码不是定长，现在固定了大小，肯定会有问题。可能还会有其他的变长数据，所以6楼的解答虽然不错，，但还不是我想要的结果。。。 大家再接再励。。。。。 你要知道这个世界上古往今来从来就没有实际存在过哪怕一例不限制最大长度的不定长字符串。 [/quote] 但考虑到内存，，你这显然会浪费啊！[/quote] 人为什么要长阑尾？

user: user-0
content: 引用 13 楼 zhao4zhong1 的回复:[quote=引用 8 楼 u012889234 的回复:] 我之前也是用结构体来解析数据部分的，但用户名和密码不是定长，现在固定了大小，肯定会有问题。可能还会有其他的变长数据，所以6楼的解答虽然不错，，但还不是我想要的结果。。。 大家再接再励。。。。。 你要知道这个世界上古往今来从来就没有实际存在过哪怕一例不限制最大长度的不定长字符串。 [/quote] 但考虑到内存，，你这显然会浪费啊！

user: user-0
content: struct _D {     short int2_0;     short int2_1;     char  int1_0;     int   int4_0;     char  int1_1;     char  str_0_len;     char  str_0[257]; } d[2];  我的意思是在处理数据部分的时候不使用结构体。。 char  str_0[257]这个字符的长度有char  str_0_len来决定。 你现在给了257固定大小，但实际可能就用了3个或7个字节的空间。 pbuf = (char *)pbuf + sizeof(UcHdr); 现在pbuf指针已经指向了buf中的数据开始的地方。。 用指针偏移的办法解析后面的每项数据。。。 这是我的疑问？、？？

user: user-1
content: 引用 8 楼 u012889234 的回复:我之前也是用结构体来解析数据部分的，但用户名和密码不是定长，现在固定了大小，肯定会有问题。可能还会有其他的变长数据，所以6楼的解答虽然不错，，但还不是我想要的结果。。。 大家再接再励。。。。。 你要知道这个世界上古往今来从来就没有实际存在过哪怕一例不限制最大长度的不定长字符串。

user: user-1
content: string是对象，不是一段内存，不适合放在struct中。

user: user-1
content: //ver:1 //resv1:0 //signature:CUC //type:69 //no:5 //resv2:0 //seq:4 //length:56 //int2,1 //int2,2 //int1,1 //int4,30 //int1,1 //int1,7 //str,beijing //int2,1 //int2,4 //int1,1 //int4,60 //int1,1 //int1,7 //str,tianjin //int4,80 //二进制文件b.bin是: //00000000h: 01 43 55 43 45 00 05 00 00 00 00 04 00 00 00 38 //00000010h: 00 01 00 02 01 00 00 00 1E 01 07 62 65 69 6A 69 //00000020h: 6E 67 00 01 00 04 01 00 00 00 3C 01 07 74 69 61 //00000030h: 6E 6A 69 6E 00 00 00 50 #pragma comment(lib,"ws2_32") #include <stdio.h> #include <stdlib.h> #include <winsock2.h> #pragma pack(push,1) struct _H {     char  ver; //  char  resv1;     char  signature[3];     char  type;     short no;     char  resv2;     int   seq;     int   length; } h; struct _D {     short int2_0;     short int2_1;     char  int1_0;     int   int4_0;     char  int1_1;     char  str_0_len;     char  str_0[257]; } d[2]; int   t,i,n; #pragma pack(pop) FILE *f; int main() {     f=fopen("b.bin","rb");     if (NULL==f) {         printf("Can not open file b.bin!\n");         return 1;     }     fread(&h,sizeof(struct _H),1,f);     i=0;     while (1) {         if (1!=fread(&d[i],sizeof(struct _D)-257,1,f)) break;         fread(d[i].str_0,d[i].str_0_len,1,f);         d[i].str_0[d[i].str_0_len]=0;         i++;         if (i>=2) break;     }     n=i;     fread(&t,sizeof(int),1,f);     fclose(f);     printf("ver:%d\n"        ,h.ver);     printf("resv1:0\n");     printf("signature:%.3s\n",h.signature);     printf("type:%d\n"       ,h.type);     printf("no:%hd\n"        ,ntohs(h.no));     printf("resv2:%d\n"      ,h.resv2);     printf("seq:%d\n"        ,ntohl(h.seq));     printf("length:%d\n"     ,ntohl(h.length));     for (i=0;i<n;i++) {         printf("%d int2_0:%hd\n"  ,i,ntohs(d[i].int2_0));         printf("%d int2_1:%hd\n"  ,i,ntohs(d[i].int2_1));         printf("%d int1_0:%d\n"   ,i,d[i].int1_0);         printf("%d int4_0:%d\n"   ,i,ntohl(d[i].int4_0));         printf("%d int1_1:%d\n"   ,i,d[i].int1_1);         printf("%d str_0_len:%d\n",i,d[i].str_0_len);         printf("%d str_0:%s\n"    ,i,d[i].str_0);     }     printf("t:%d\n"     ,ntohl(t));     return 0; } //ver:1 //resv1:0 //signature:CUC //type:69 //no:5 //resv2:0 //seq:4 //length:56 //0 int2_0:1 //0 int2_1:2 //0 int1_0:1 //0 int4_0:30 //0 int1_1:1 //0 str_0_len:7 //0 str_0:beijing //1 int2_0:1 //1 int2_1:4 //1 int1_0:1 //1 int4_0:60 //1 int1_1:1 //1 str_0_len:7 //1 str_0:tianjin //t:80 //

user: user-2
content: 效率低不低取决于你的协议，局部来说你也可以一次取出几K，分析完了再读取几K这样来提升效率。  引用 2 楼 u012889234 的回复:[quote=引用 1 楼 turingo 的回复:] 用fgetc一个字节一个字节的分析处理。   好像不行哦！！！！！貌似这效率也蛮低的。[/quote]

user: user-0
content: 引用 1 楼 turingo 的回复:用fgetc一个字节一个字节的分析处理。   好像不行哦！！！！！貌似这效率也蛮低的。

user: user-2
content: 用fgetc一个字节一个字节的分析处理。

user: user-0
content: 引用 4 楼 qq120848369 的回复:很简单啊，准备一个std::string，然后parse发现数据不够就再读一些进来啊，parse完了erase掉继续啊。  c语言

user: user-0
content: 我之前也是用结构体来解析数据部分的，但用户名和密码不是定长，现在固定了大小，肯定会有问题。可能还会有其他的变长数据，所以6楼的解答虽然不错，，但还不是我想要的结果。。。 大家再接再励。。。。。