zoukankan      html  css  js  c++  java
  • 主机字节序与网络字节序的转换

    前言

      我们知道,数据在主机内的存放有两种模式,也就是说,主机字节序有两种:大端和小端( 这里假定读者已经清楚这个问题 )。但在网络通信中,要求通信数据( 通信数据这里指IP号和端口号 )的使用必须用网络字节序。什么又是网络字节序?网络字节序可以理解为主机字节序的大端模式。如果你的主机字节序原本就是大端模式,那么你可以考虑不用将通信数据转换为网络字节序;但如果你的主机字节序是小端,那么通信数据必须被下面提及到的其中某个函数进行处理,转换成网络字节序后方可使用( 即存放进套接字地址结构变量 )。

    查看主机字节序

      运行下面一段小程序即可查看你的主机字节序( 注释略 )

     1 #include <stdio.h>
     2 
     3 int main(int argc, char **argv)
     4 {
     5     union {
     6         short s;
     7         char c[sizeof(short)];
     8     } un;
     9 
    10     un.s = 0x0102;
    11     if (un.c[0] == 1 && un.c[1] == 2) {
    12         puts("字节序为小端");
    13     }
    14     else if (un.c[0] == 2 && un.c[1] == 1) {
    15         puts("字节序为大端");
    16     }
    17     else {
    18         puts("字节序未知");
    19     }
    20 
    21     return 0;
    22 }

      本机运行情况:

      

    转换函数

      以下几个转换函数均包含在头文件 netinet/in.h

      1. uint16_t htons ( uint16_t host16bitvalue )

      将16位的主机字节序无符号整型变量转换为网络字节序格式

      2. uint32_t htonl ( uint32_t host32bitvalue )

      将32位的主机字节序无符号整型变量转换为网络字节序格式

      3. uint16_t ntohs ( uint16_t net16bitvalue )

      将16位的网络字节序无符号整型变量转换为主机字节序格式

      4. uint32_t ntohl ( uint32_t net32bitvalue )

      将32位的网络字节序无符号整型变量转换为主机字节序格式

    说明

      以上函数中" h "代表主机字节序;" n "代表网络字节序;" s "代表16位的无符号整型变量( 往往是端口 );" l “代表32位的无符号整型变量( 往往是Ipv4地址 )。

  • 相关阅读:
    Roofline Model与深度学习模型的性能分析
    卷积神经网络的复杂度分析
    CNN中卷积层的计算细节
    ImageNet 历届冠军最新评析:哪个深度学习模型最适合你?
    最新ICE源码编译安装
    CNN 模型压缩与加速算法综述
    YAML 与 front-matter
    VMware 虚拟机快照、克隆、磁盘扩容
    ubuntu16.04安装Nvidia显卡驱动、CUDA8.0和cudNN V6
    宏使用 Tricks
  • 原文地址:https://www.cnblogs.com/scut-fm/p/3323289.html
Copyright © 2011-2022 走看看