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

字节序分为 little-endian 和 big-endian,不同主机通信字节序转换过程:

主机字节序 -> 网络字节序 ->主机字节序

判断网络字节序:

  1. #include <arpa/inet.h>
  2. int isBigEndian()
  3. {
  4. int flag = 0;
  5. short a = htons(0x0102);
  6. char* p = &a;
  7. if(*p==0x01)
  8. {
  9. flag = 1;
  10. }
  11. return flag;
  12. }

网络字节序为big-endian

判断主机字节序:

  1. int isBigEndian()
  2. {
  3. int flag = 0;
  4. short a = 0x0102;
  5. char* p = &a;
  6. if(*p==0x01)
  7. {
  8. flag = 1;
  9. }
  10. return flag;
  11. }

我的本地主机字节序为little-endian

来自为知笔记(Wiz)

时间: 2024-10-14 08:59:51

不同主机跨网通信时的字节序转换的相关文章

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

字节序分为 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; } ``` **网络字

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

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

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

在网络信息跨主机传输过程中,不同主机的字节序问题可能不同,因此必须进行字节序的转换. 本地字节序--> 网络字节序 -->本地字节序 字节序转换函数: htons和htonl是将本地字节序转换为网络字节序,htons是对16位整数进行转换,htonl是对32位正数进行转换,ntohs和ntohl恰好相反. 判断主机字节序和网络字节序: #include<arpa/inet.h> #include<stdio.h> //judge host endian void jud

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

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

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

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

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

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

字节序转换与结构体位域(bit field)值的读取 Part 2 - 深入理解字节序和结构体位域存储方式

上一篇文章讲解了带位域的结构体,在从大端机(Big Endian)传输到小端机(Little Endian)后如何解析位域值.下面继续深入详解字节序,以及位域存储的方式. (1) 我们知道,存储数字时,对小端机而言,数字的低位,存在低地址,高位存在高地址.大端机正相反. (2) 读取的方式,也是一样的.对于小端机,读出的低地址位作为数字的低位. (3) 此外Big-Endian/Little-Endian存储顺序,不仅仅针对字节,还针对字节内的比特位.对于小端机而言,字节内的8个比特,低地址端比

字节序转换与结构体位域(bit field)值的读取

最近又遇到了几年前遇到的问题,标记一下. 对于跨字节位域(bit field)而言,如果数据传输前后环境的字节序不同(LE->BE,BE->LE),简单地调用(ntohs/ntohl/htons/htonl)并不能正确读取位域的值. 例如: struct _exam_ { unsigned int tag : 6; unsigned int field1 : 3; unsigned int field2 : 7; unsigned int field3 : 11; unsigned int p

写一程序,判断运行程序的系统是大字节序还是小字节序?写函数实现大小字节序转换

#include <stdio.h> #include <netinet/in.h> int main() { int i_num = 0x12345678; printf("[0]:0x%x\n", *((char *)&i_num + 0)); printf("[1]:0x%x\n", *((char *)&i_num + 1)); printf("[2]:0x%x\n", *((char *)&