免费注册 查看新帖 |

Chinaunix

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

[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:}

论坛徽章:
0
2 [报告]
发表于 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
3 [报告]
发表于 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
4 [报告]
发表于 2010-12-28 09:53 |显示全部楼层
回复 4# xiaobenniao514
可是接受的数据却不尽人意啊,

论坛徽章:
0
5 [报告]
发表于 2010-12-28 11:08 |显示全部楼层
回复 8# id_for_fun
那该如何调整循序呢?
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP