CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
可用分押宝游戏火热进行中... 专题改版:Java Web 专题
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  C/C++ >  C语言

SOS!!!关于ntohl,ntohs的转换问题!!!

楼主heskyII(赫斯基)2005-08-02 17:37:00 在 C/C++ / C语言 提问

现在有一个从网络传输过来的编码,连续占据8个字节(如年月日:20050802),但ntohl一次只能转4个字节,ntohs只能转2个字节,因此无法用上述两个函数对一个连续的8个字节内容进行转换,如果分成两次用ntohl转换是否会出问题?????  
          也就是说第一次用一个4字节的空间存放前4位(2005),然后用另一个4字节的空间存放后4位(0802),然后再将两个字符串拼接起来。  
          问题出来了:在不同的平台间进行通讯(CPU,OS或网络通讯协议不同),这样操作是否会出问题,比如Intel的CPU和Sun的CPU,存放数据的顺序不同(据说是这样)。  
          谁能给个比较好的解释啊????拜托啦!!!!  
          以下是一个具体的说明:  
                  int   LI_work,LI_work2;  
                  char   CH_Data[8];  
                  //处理前4位  
                  memcpy(&LI_work,   CH_Data,   sizeof(LI_work));  
                  LI_work2   =   ntohl(LI_work);  
                  memcpy(CH_Data,   &LI_work2,   sizeof(LI_work2));  
                  //处理后4位  
                  memcpy(&LI_work,   CH_Data[4],   sizeof(LI_work));  
                  LI_work2   =   ntohl(LI_work);  
                  memcpy(CH_Data[4],   &LI_work2,   sizeof(LI_work2));  
  问题点数:30、回复次数:13Top

1 楼heskyII(赫斯基)回复于 2005-08-02 17:37:43 得分 0

如果传输的是ASCII码,处理方式也是一样???Top

2 楼jixingzhong(瞌睡虫·星辰)回复于 2005-08-02 18:15:38 得分 20

这个问题就是    
   
   
  通讯协议的问题了  
   
   
  传输数据,  
   
  你可以指定一套规则,  
   
  在要求传输的两个机器上使用  
   
  那么就可以解决你的问题了Top

3 楼jeanssun(西部牛仔||孙耀文)回复于 2005-08-02 18:31:57 得分 0

恩,不懂,只能顶顶顶!!!Top

4 楼newbiestar()回复于 2005-08-02 19:40:27 得分 0

你的问题描述有问题  
   
  20050802你作为什么样的形式在存贮?Top

5 楼WingForce(初六,履霜,坚冰至。)回复于 2005-08-02 19:52:29 得分 0

传字符串完全可以不要转来转去的Top

6 楼xjp6688(大平/要做必须最好)回复于 2005-08-03 08:03:56 得分 0

找找SOCKET的东西,有些忘了  
  Top

7 楼fhway(不会游泳的鱼)回复于 2005-08-03 09:27:09 得分 0

以上没有一点实用价值,都是在歌德巴赫猜想哈!Top

8 楼heskyII(赫斯基)回复于 2005-08-03 09:41:37 得分 0

回复人:   newbiestar()   (   )   信誉:110     2005-08-02   19:40:00     得分:   0      
     
     
        你的问题描述有问题  
   
  20050802你作为什么样的形式在存贮?  
       
     
  以ASCII码形式存放,在.dat文件中的形式是:3200003500380032Top

9 楼antter(JiangMiao)回复于 2005-08-03 09:45:39 得分 0

不可行,须自已写个转换程序,host-byte与network-byte之间互相转换是非常容易实现的。Top

10 楼heskyII(赫斯基)回复于 2005-08-03 13:08:04 得分 0

那谁能给点提示该怎样实现host-byte与network-byte之间互相转换???Top

11 楼sanban(三板)回复于 2005-08-03 15:50:37 得分 5

具我的实践得知htons,htonl的转换出来的字节序都是大端的字节序。  
  如果你想要实现host-byte,network-byte的转换。  
  你可以先写一判断机器是大端机还是小端机的函数byte_order()。  
  网络协议上传输的都是大端字节序。  
  所以,你在实现network-byte时先调用byte_order()得知本机是大端还是小端。  
  大端无须转换就可以直接发送了。  
  小端需要按4bit调换为大端在传送。  
  所以,你在实现host-byte时先也调用byte_order()得知本机是大端还是小端。  
  大端无须转换就可以直接使用。  
  小端则需要按4bit转换回小端后使用。  
  Top

12 楼antter(JiangMiao)回复于 2005-08-03 16:02:15 得分 5

楼上的实践是正确的,network-byte是big-endian,而host-byte是little-endian,  
  x86系统使用的是little-endian型式。  
   
  知道何为little-endian,何为big-endian,就可轻松转换。  
  还是不清楚的话可以访问  
  http://www.sssdf.com/show.jsp?categoryid=2&id=00007  
  中的字节顺序一节。Top

13 楼bugebear3(bug)回复于 2005-08-22 15:21:31 得分 0

x86系统使用的是little-endian型式,在主机字节序中,低位放在内存低端  
   
  下面的小程序可以帮助你认识什么是little-endian型式  
   
  #include<stdio.h>  
  int   main(void)  
  {  
  char   s[]={1,1,0,0};  
  printf("%d",*((int   *)s));  
  return   0;  
  }Top

相关问题

  • 用ntohs()转换后的是整无符号整型,怎么再把它转换成相应的字符串?
  • 什么时候该用htonl,ntohl,htons,等这些函数转换字节顺序
  • 转换???
  • 转换
  • 转换
  • 转换
  • 转换
  • 类的转换
  • 类型转换!
  • 怎样转换????????

关键词

  • 转换
  • 大端
  • ntohl
  • li
  • endian
  • work
  • 问题
  • 存放
  • 序
  • 型式

得分解答快速导航

  • 帖主:heskyII
  • jixingzhong
  • sanban
  • antter

相关链接

  • C/C++ Blog
  • C/C++类图书
  • C/C++类源码下载

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
世纪乐知(北京)网络技术有限公司 版权所有, 京 ICP 证 020026 号
北京创新乐知广告有限公司 提供技术支持
Copyright © 2000-2007, CSDN.NET, All Rights Reserved
GongshangLogo