免费注册 查看新帖 |

Chinaunix

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

[C++] socket 中如何获取二进制数据 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2010-12-27 22:37 |只看该作者 |倒序浏览
如题,加入有数据为二进制格式,顺序为:header(short):contents(int):tail(short)..., 通过socket通信获得了此数据,
请问该如何解析呢?
1:用char 数组解析?
2:设一数据结构为
  1. typedef struct {
  2. unsigned short header;
  3. unsigned int  contents;
  4. unsigned short tail;
  5. } msg;
  6. ...
  7. msg *pmsg;
  8. pmsg = (msg *)malloc(sizeof(msg));
  9. memcpy(pmsg, &source ,sizeof(msg));
复制代码
获取数据对象?
不知哪个靠谱啊,请高人指点。{:3_200:}

论坛徽章:
26
处女座
日期:2016-04-18 14:00:4515-16赛季CBA联赛之深圳
日期:2020-06-02 10:10:5015-16赛季CBA联赛之广夏
日期:2019-07-23 16:59:452016科比退役纪念章
日期:2019-06-26 16:59:1315-16赛季CBA联赛之天津
日期:2019-05-28 14:25:1915-16赛季CBA联赛之青岛
日期:2019-05-16 10:14:082016科比退役纪念章
日期:2019-01-11 14:44:062016科比退役纪念章
日期:2018-07-18 16:17:4015-16赛季CBA联赛之上海
日期:2017-08-22 18:18:5515-16赛季CBA联赛之江苏
日期:2017-08-04 17:00:4715-16赛季CBA联赛之佛山
日期:2017-02-20 18:21:1315-16赛季CBA联赛之天津
日期:2016-12-12 10:44:23
2 [报告]
发表于 2010-12-28 00:36 |只看该作者
就是这样 !

论坛徽章:
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
3 [报告]
发表于 2010-12-28 08:41 |只看该作者
不用memcpy,指针强制转换下就可以了

论坛徽章:
0
4 [报告]
发表于 2010-12-28 08:59 |只看该作者
传sizeof(msg)大小的串过去就可以了,那边再把这串类型强制转成msg类型。
或者发送端进行序列化,接收端再反序列化。就像java的序列化,我是这样理解的,不知道对不对。

论坛徽章:
0
5 [报告]
发表于 2010-12-28 09:36 |只看该作者
回复 2# evaspring
那么,如果我用 CHAR 数组一个字节一个字节的接受呢,而不是按发送方的数据格式,是否会出现数据错位呢?
  1. typedef struct {
  2. int header;
  3. unsigned short contents;
  4. unsigned short tail;
  5. } send_data;

  6. typedef struct {
  7. char data[8];
  8. } recv_data;

  9. int main()
  10. {
  11. ...
  12. recv_data *rd;
  13. rd = (recv_data *)malloc(sizeof(recv_data));
  14. memcpy(recv_data, &data, sizeof(recv_data));
  15. ...

  16. }
复制代码
是否会出现字节排序错乱的情况?

论坛徽章:
0
6 [报告]
发表于 2010-12-28 09:51 |只看该作者
回复 3# hellioncu
  1.         // Get the header, and check command
  2.         memcpy(buf, line.c_str(), sizeof(GK301_header) + sizeof(GK301_login) + sizeof(GK301_tail));
  3.         GK301_login *glg;
  4.         glg = (GK301_login *)malloc(sizeof(GK301_login));
  5.         memcpy(glg, buf + sizeof(GK301_header), sizeof(GK301_login));
  6.         printf("ID=%x%x%x%x%x%x%x%x, Rec=0x%x\n", glg->id[0], glg->id[1], glg->id[2],glg->id[3],
  7.                 glg->id[4],glg->id[5],glg->id[6],glg->id[7],glg->id_num);
  8.         // Get the tail, may be we need the serial number
  9.         GK301_tail *gtl;
  10.         gtl = (GK301_tail *)malloc(sizeof(GK301_tail));
  11.         memcpy(gtl, buf + sizeof(GK301_header) + sizeof(GK301_login), sizeof(GK301_tail));
  12.         printf("Serial=0x%x, CRC=0x%x, Stop=0x%x\n", gtl->seq, gtl->crc, gtl->stop);

  13.         // At last, we should reply a package to the terminal device
  14.         bzero(buf, sizeof(buf));
  15.         memcpy(buf, line.c_str(), sizeof(GK301_header));
  16.         memcpy(buf + sizeof(GK301_header), gtl, sizeof(GK301_tail));
  17.         result = buf;
复制代码
那么请看以上的代码,我的处理有问题吗,无法获得我想要的数据啊,只能获得部分数据。

论坛徽章:
0
7 [报告]
发表于 2010-12-28 09:53 |只看该作者
回复 4# xiaobenniao514
可是接受的数据却不尽人意啊,

论坛徽章:
0
8 [报告]
发表于 2010-12-28 09:56 |只看该作者
网路通信要注意字节序。来回都转换一下

论坛徽章:
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
9 [报告]
发表于 2010-12-28 10:25 |只看该作者
回复  hellioncu 那么请看以上的代码,我的处理有问题吗,无法获得我想要的数据啊,只能获得部分数据。
:e ...
liunxcu 发表于 2010-12-28 09:51



    先保证line中的数据是完整的

论坛徽章:
0
10 [报告]
发表于 2010-12-28 10:55 |只看该作者
关注
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP