UNIX(网络编程-基本用法):02---主机字节序、网络字节序(htons、htonl、ntohs、ntohl)

一、主机字节序、网络字节序

  • 主机字节序:数值的存储采用小端法存储。数值低位存储在内存的低地址,数值高位存储在内存的高地址
  • 网络字节序:数值的存储采用大端法存储。数值高位存储在内存的低地址,数值低位存储在内存的高地址
  • 例如:有一个整型0x12345678(4字节)。左侧为主机字节序,右侧为网络字节序

UNIX(网络编程-基本用法):02---主机字节序、网络字节序(htons、htonl、ntohs、ntohl)_第1张图片

二、字节序的转换

  • 主机字节序转换为网络字节序:
#include 
#include

uint32_t htonl(uint32_t hostlong);
uint16_t htons(uint16_t hostshort);

//返回值:都返回网络字节序的值
  • 网络字节序转换为主机字节序:
#include 
#include

uint32_t ntohl(uint32_t netlong);
uint16_t ntohs(uint16_t netshort);

//返回值:都返回主机字节序的值

h---host:本地主机

n---network:网络的意思

l---unsigned long

s---unsigned short

三、演示案例

  • 检验自己的主机是大端存储还是小端存储
  • 字符串CPU_VENDOR_OS是由GNU的autoconf程序在配置本书中的软件时确定的,它表示CPU类型、厂家和操作系统版本
int main(int argc, char **argv)
{
    union {
        short  s;
        char   c[sizeof(short)];
    } un;

    un.s = 0x0102;
    printf("%s: ", CPU_VENDOR_OS);
    if (sizeof(short) == 2) {
        if (un.c[0] == 1 && un.c[1] == 2)
            printf("big-endian\n");
        else if (un.c[0] == 2 && un.c[1] == 1)
            printf("little-endian\n");
        else
            printf("unknown\n");
    } else
        printf("sizeof(short) = %d\n", sizeof(short));

    exit(0);
}

总结:

UNIX(网络编程-基本用法):02---主机字节序、网络字节序(htons、htonl、ntohs、ntohl)_第2张图片

你可能感兴趣的:(UNIX(网络编程-基本用法))