字节序转换以及判断字节序

在网络信息跨主机传输过程中,不同主机的字节序问题可能不同,因此必须进行字节序的转换。

本地字节序--> 网络字节序 -->本地字节序

字节序转换函数:

htons和htonl是将本地字节序转换为网络字节序,htons是对16位整数进行转换,htonl是对32位正数进行转换,ntohs和ntohl恰好相反。

判断主机字节序和网络字节序:

  1. #include<arpa/inet.h>
  2. #include<stdio.h>
  3. //judge host endian
  4. void judge_host_endian()
  5. {
  6. short arg = 0x0102;
  7. short* ap = &arg;
  8. char* temp = (char*)ap;
  9. if(*temp==0x01)
  10. {
  11. puts("host:big-endian");
  12. }
  13. else if(*temp==0x02)
  14. {
  15. puts("host:small-endian");
  16. }
  17. }
  18. //judge net endian
  19. void judge_net_endian()
  20. {
  21. uint16_t arg = htons((uint16_t)0x0102);
  22. short* ap = &arg;
  23. char* temp = (char*)ap;
  24. if(*temp==0x01)
  25. {
  26. puts("net:big-endian");
  27. }
  28. else if(*temp==0x02)
  29. {
  30. puts("net:small-endian");
  31. }
  32. }
  33. int main()
  34. {
  35. judge_host_endian();
  36. judge_net_endian();
  37. return 0;
  38. }

所以win7是small-endian,网络字节序是big-endian。

来自为知笔记(Wiz)

时间: 2024-10-03 02:46:28

字节序转换以及判断字节序的相关文章

网络通信之 字节序转换原理与网络字节序、大端和小端模式

原文地址:http://www.cnblogs.com/fuchongjundream/p/3914770.html 一.在进行网络通信时是否需要进行字节序转换? 相同字节序的平台在进行网络通信时可以不进行字节序转换,但是跨平台进行网络数据通信时必须进行字节序转换. 原因如下:网络协议规定接收到得第一个字节是高字节,存放到低地址,所以发送时会首先去低地址取数据的高字节.小端模式的多字节数据在存放时,低地址存放的是低字节,而被发送方网络协议函数发送时会首先去低地址取数据(想要取高字节,真正取得是低

网络通信时字节序转换原理与网络字节序、大端和小端模式

引言:在进行网络通信时是否需要进行字节序转换? 相同字节序的平台在进行网络通信时可以不进行字节序转换,但是跨平台进行网络数据通信时必须进行字节序转换. 原因如下:网络协议规定接收到得第一个字节是高字节,存放到低地址,所以发送时会首先去低地址取数据的高字节.小端模式的多字节数据在存放时,低地址存放的是低字节,而被发送方网络协议函数发送时会首先去低地址取数据(想要取高字节,真正取得是低字节),接收方网络协议函数接收时会将接收到的第一个字节存放到低地址(想要接收高字节,真正接收的是低字节),所以最后双

网络通信之字节序转换原理与网络字节序、大端和小端模式

一.在进行网络通信时是否需要进行字节序转换? 相同字节序的平台在进行网络通信时可以不进行字节序转换,但是跨平台进行网络数据通信时必须进行字节序转换. 原因如下:网络协议规定接收到得第一个字节是高字节,存放到低地址,所以发送时会首先去低地址取数据的高字节.小 端模式的多字节数据在存放时,低地址存放的是低字节,而被发送方网络协议函数发送时会首先去低地址取数据(想要取高字节,真正取得是低字节),接收方网络 协议函数接收时会将接收到的第一个字节存放到低地址(想要接收高字节,真正接收的是低字节),所以最后

c# 主机和网络字节序的转换 关于网络字节序和主机字节序的转换

最近使用C#进行网络开发,需要处理ISO8583报文,由于其中有些域是数值型的,于是在传输的时候涉及到了字节序的转换. 字节顺序是指占内存多于一个字节类型的数据在内存中的存放顺序,通常有两种字节顺序,根据他们所处的位置我们分别称为主机节序和网络字节序. 通常我们认为网络字节序为标准顺序,封包的时候,将主机字节序转换为网络字节序,拆包的时候要将网络字节序转换为主机字节序. 原以为还要自己写函数,其实网络库已经提供了. 主机到网络:short/int/long IPAddress.HostToNet

判断字节序

大字节序(Big Endian):低地址存高位 小字节序(Little Endian):高地址存地位 int main() { int x=1; char *temp = NULL; temp= (char *)&x; if (*temp ==1) { printf("Little endian!\n"); } else { printf("Big endian!\n"); return 0; } } int型x的值为00 00 00 01 内存地址    

不同主机跨网通信时的字节序转换

字节序分为 little-endian 和 big-endian,不同主机通信字节序转换过程: 主机字节序 -> 网络字节序 ->主机字节序 判断网络字节序: #include <arpa/inet.h> int isBigEndian() { int flag = 0; short a = htons(0x0102); char* p = &a; if(*p==0x01) { flag = 1; } return flag; } 网络字节序为big-endian 判断主机

主机字节序和网络字节序转换

为什么要转换? 主机字节序:整数在内存中保存的顺序,不同的处理器对应不容的模式 Little endian 将低序字节存储在起始地址 Big endian    将高序字节存储在起始地址 网络字节序:整数在网络中的发送顺序 网络字节顺序是TCP/IP中规定好的一种数据表示格式,它与具体的CPU类型.操作系统等无关,从而可以保证数据在不同主机之间传输时能够被正确解释. 网络字节顺序采用big endian排序方式 htons 本地的无符号short型主机字节序转换为网络字节序 htonl    

主机跨网通信时的字节序转换

字节序分为 little-endian 和 big-endian,不同主机通信字节序转换过程: **主机字节序 -> 网络字节序 ->主机字节序** ####判断网络字节序: ``` #include <arpa/inet.h> int isBigEndian() { int flag = 0; short a = htons(0x0102); char* p = &a; if(*p==0x01) { flag = 1; } return flag; } ``` **网络字

理解字节序 大端字节序和小端字节序

1. 计算机硬件有两种储存数据的方式:大端字节序(big endian)和小端字节序(little endian). 举例来说,数值0x2211使用两个字节储存:高位字节是0x22,低位字节是0x11. 大端字节序:高位字节在前,低位字节在后,这是人类读写数值的方法. 小端字节序:低位字节在前,高位字节在后,即以0x1122形式储存. 同理,0x1234567的大端字节序和小端字节序的写法如下图. 2. 我一直不理解,为什么要有字节序,每次读写都要区分,多麻烦!统一使用大端字节序,不是更方便吗?