SOS!!!关于ntohl,ntohs的转换问题!!!
现在有一个从网络传输过来的编码,连续占据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




