免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
123下一页
最近访问板块 发新帖
查看: 5404 | 回复: 25
打印 上一主题 下一主题

[C++] c如何从字节码中取出整形和字符串? [复制链接]

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2015-07-31 10:53 |只看该作者 |倒序浏览
  1. int chartoint(char** p)
  2. {
  3.         int iOutcome=0;
  4.         for (int i = 0; i < 4; i++) {
  5.                 iOutcome += (**p++ & 0xFF) << (8 * i);
  6.         }
  7.         return iOutcome;
  8. }

  9. int test()
  10. {
  11.         int iOutcome=0,iOutcome1=0,iOutcome2=0;
  12.         char send_move[20] = {0};
  13.         char nickname[10]={0};
  14.         char* tmp="我是人";
  15.         int *q=NULL;
  16.         q = (int *)send_move;
  17.         *q++=5;
  18.         *q++=5000;
  19.         *q++=strlen(tmp);
  20.         char* p=(char*)&send_move;
  21.         char *nickname_des_buff=p+(sizeof(int)*3);
  22.         memcpy(nickname_des_buff, tmp,strlen(tmp));

  23.         iOutcome=chartoint(&p);
  24.         iOutcome1=chartoint(&p);
  25.         iOutcome2=chartoint(&p);
  26.         memcpy(nickname,p,iOutcome2);
  27.         printf("%d==%d==%s\n",iOutcome,iOutcome1,iOutcome2,nickname);
  28. }

  29. int main() {
  30.         test();
  31. }
复制代码
因为是一个数据流,里面有整形+整形+整形(描述后面字符串的长度)+字符串+整形 之类的格式,chartoint(char** p)改成 chartoint(char*p)传递的时候直接串p而不是&p就可以,但这样处理起来挺麻烦,调用完后还得跟他移位,能不能传地址来操作??不是很熟悉这块。

论坛徽章:
324
射手座
日期:2013-08-23 12:04:38射手座
日期:2013-08-23 16:18:12未羊
日期:2013-08-30 14:33:15水瓶座
日期:2013-09-02 16:44:31摩羯座
日期:2013-09-25 09:33:52双子座
日期:2013-09-26 12:21:10金牛座
日期:2013-10-14 09:08:49申猴
日期:2013-10-16 13:09:43子鼠
日期:2013-10-17 23:23:19射手座
日期:2013-10-18 13:00:27金牛座
日期:2013-10-18 15:47:57午马
日期:2013-10-18 21:43:38
2 [报告]
发表于 2015-07-31 11:03 |只看该作者
整形什么的固定长度部分定义成一个结构,直接强制转换成结构指针再访问就可以了

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
3 [报告]
发表于 2015-07-31 11:50 |只看该作者
本帖最后由 jd808 于 2015-07-31 11:51 编辑
hellioncu 发表于 2015-07-31 11:03
整形什么的固定长度部分定义成一个结构,直接强制转换成结构指针再访问就可以了
字符串咋办??因为顺序是不能保证的,上面只是模糊的说下,实际情况是这样子的,用python的字典描述比较方便
{
"name":"我是",
"lv":1,
"vip":25,
"info":"这是啥"
}
顺序不定,多少不定,有时候只传递lv或者vip,有时候又全部传递,没法直接转结构体呀。而且字符串也得描述字符串的长度。不然没法读取字符串。

论坛徽章:
324
射手座
日期:2013-08-23 12:04:38射手座
日期:2013-08-23 16:18:12未羊
日期:2013-08-30 14:33:15水瓶座
日期:2013-09-02 16:44:31摩羯座
日期:2013-09-25 09:33:52双子座
日期:2013-09-26 12:21:10金牛座
日期:2013-10-14 09:08:49申猴
日期:2013-10-16 13:09:43子鼠
日期:2013-10-17 23:23:19射手座
日期:2013-10-18 13:00:27金牛座
日期:2013-10-18 15:47:57午马
日期:2013-10-18 21:43:38
4 [报告]
发表于 2015-07-31 12:06 |只看该作者
jd808 发表于 2015-07-31 11:50
字符串咋办??因为顺序是不能保证的,上面只是模糊的说下,实际情况是这样子的,用python的字典描述比较方 ...


变长字符串按起始地址和长度处理跳过去就行。

“顺序不定,多少不定”,那具体的描述信息在哪里给出?

根据你的情况,我觉得protobuf可能比较适合你,省得这样硬编码了

论坛徽章:
6
酉鸡
日期:2013-11-04 15:30:02巳蛇
日期:2014-01-23 10:36:23双鱼座
日期:2014-01-23 13:08:332015亚冠之鹿岛鹿角
日期:2015-09-03 14:36:002015亚冠之武里南联
日期:2015-09-18 10:48:1315-16赛季CBA联赛之山西
日期:2016-05-05 00:05:33
5 [报告]
发表于 2015-07-31 12:08 |只看该作者
不定长的数据放最后,用
char str_data[0];表示

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
6 [报告]
发表于 2015-07-31 12:10 |只看该作者
hellioncu 发表于 2015-07-31 12:06
变长字符串按起始地址和长度处理跳过去就行。

“顺序不定,多少不定”,那具体的描述信息在哪里给出 ...
就同步几个核心数据,懒得用它,现在基本搞定。

论坛徽章:
14
巨蟹座
日期:2013-11-19 14:09:4615-16赛季CBA联赛之青岛
日期:2016-07-05 12:36:0515-16赛季CBA联赛之广东
日期:2016-06-29 11:45:542015亚冠之全北现代
日期:2015-07-22 08:09:472015年辞旧岁徽章
日期:2015-03-03 16:54:15巨蟹座
日期:2014-12-29 08:22:29射手座
日期:2014-12-05 08:20:39狮子座
日期:2014-11-05 12:33:52寅虎
日期:2014-08-13 09:01:31巳蛇
日期:2014-06-16 16:29:52技术图书徽章
日期:2014-04-15 08:44:01天蝎座
日期:2014-03-11 13:06:45
7 [报告]
发表于 2015-07-31 12:34 |只看该作者
你的代码中有很多低级错误,另外,如果这道题用C++ template来做的话,就会很优雅。
当然,听hellioncu的,用protobuf是正道(虽然我没用过)
  1. #include <stdio.h>
  2. #include <string.h>

  3. void foo_write_int( char* p, size_t* off, int n )
  4. {
  5.     *(int*)(p+*off) = n;
  6.     *off += sizeof(int);
  7. }
  8. void foo_read_int( const char* p, size_t* off, int* n )
  9. {
  10.     *n = *(int*)(p+*off);
  11.     *off += sizeof(int);
  12. }

  13. void foo_write_string( char* p, size_t* off, const char* s )
  14. {
  15.     size_t len = strlen(s);
  16.     *(size_t*)(p+*off) = len;
  17.     *off += sizeof(size_t);
  18.     memcpy( p+*off, s, len );
  19.     *off += len;
  20. }
  21. void foo_read_string( const char* p, size_t* off, char* s )
  22. {
  23.     size_t len = *(size_t*)(p+*off);
  24.     *off += sizeof(size_t);
  25.     memcpy( s, p+*off, len );
  26.     *off += len;
  27.     s[len] = '\0';
  28. }

  29. int main( void )
  30. {
  31.     char line[100];

  32.     {
  33.         int a = 5;
  34.         int b = 5000;
  35.         const char* c = "Your are man";

  36.         size_t off = 0;
  37.         foo_write_int( line, &off, a );
  38.         foo_write_int( line, &off, b );
  39.         foo_write_string( line, &off, c );
  40.     }

  41.     {
  42.         int a;
  43.         int b;
  44.         char c[20];

  45.         size_t off = 0;
  46.         foo_read_int( line, &off, &a );
  47.         foo_read_int( line, &off, &b );
  48.         foo_read_string( line, &off, c );

  49.         printf( "%d, %d, %s\n", a, b, c );
  50.     }

  51.     return 0;
  52. }
复制代码

论坛徽章:
324
射手座
日期:2013-08-23 12:04:38射手座
日期:2013-08-23 16:18:12未羊
日期:2013-08-30 14:33:15水瓶座
日期:2013-09-02 16:44:31摩羯座
日期:2013-09-25 09:33:52双子座
日期:2013-09-26 12:21:10金牛座
日期:2013-10-14 09:08:49申猴
日期:2013-10-16 13:09:43子鼠
日期:2013-10-17 23:23:19射手座
日期:2013-10-18 13:00:27金牛座
日期:2013-10-18 15:47:57午马
日期:2013-10-18 21:43:38
8 [报告]
发表于 2015-07-31 12:43 |只看该作者
bruceteen 发表于 2015-07-31 12:34
你的代码中有很多低级错误,另外,如果这道题用C++ template来做的话,就会很优雅。
当然,听hellioncu的, ...



这样读写整数,如果没对齐,某些硬件下可能会总线错。
主要还是LZ不该这么设计

论坛徽章:
14
巨蟹座
日期:2013-11-19 14:09:4615-16赛季CBA联赛之青岛
日期:2016-07-05 12:36:0515-16赛季CBA联赛之广东
日期:2016-06-29 11:45:542015亚冠之全北现代
日期:2015-07-22 08:09:472015年辞旧岁徽章
日期:2015-03-03 16:54:15巨蟹座
日期:2014-12-29 08:22:29射手座
日期:2014-12-05 08:20:39狮子座
日期:2014-11-05 12:33:52寅虎
日期:2014-08-13 09:01:31巳蛇
日期:2014-06-16 16:29:52技术图书徽章
日期:2014-04-15 08:44:01天蝎座
日期:2014-03-11 13:06:45
9 [报告]
发表于 2015-07-31 15:54 |只看该作者
hellioncu 发表于 2015-07-31 12:43
这样读写整数,如果没对齐,某些硬件下可能会总线错。
主要还是LZ不该这么设计

是,是,忘了对齐这茬。在不对齐的情况下,应该老老实实的用memcpy了。

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
10 [报告]
发表于 2015-07-31 16:00 |只看该作者
bruceteen 发表于 2015-07-31 12:34
你的代码中有很多低级错误,另外,如果这道题用C++ template来做的话,就会很优雅。
当然,听hellioncu的, ...
哇,着指针用的出神入化啊,指针我只会一点点啊。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP