网络序,主机序学习

网络序,主机序学习

网络序,主机序总是迷迷糊糊的。需要整理一下。
千言万语,不如代码来的实在。哈哈,说干就干。

#include <stdio.h>
#include <stdlib.h>
#include <arpa/inet.h>

int host_order()
{
    unsigned long a = 0x12345678;
    unsigned char * p = (unsigned char *)(&a);

    printf("主机字节序:%0x  %0x %0x %0x\n",p[0],p[1],p[2],p[3]);

    unsigned long b = htonl(a);

    p = (unsigned char *)(&b);

    printf("网络字节序:%0x  %0x %0x %0x\n",p[0],p[1],p[2],p[3]);

    return 0;
}

int net_order()
{
    struct in_addr ipaddr;
    unsigned long addr = inet_addr("192.168.1.100");
    unsigned char *p = (unsigned char *)(&addr);
    printf("addr = %u \n",addr);
    printf("%0x %0x %0x %0x : inet_addr 192.168.1.100\n",p[0],p[1],p[2],p[3]);
    printf("%d  %d  %d  %d : inet_addr 192.168.1.100\n",p[0],p[1],p[2],p[3]);
    unsigned long addr_host = ntohl(addr);
    p = (unsigned char *)(&addr_host);
    printf("%0x %0x %0x %0x : inet_addr ntohl 192.168.1.100\n",p[0],p[1],p[2],p[3]);
    printf("%d  %d  %d  %d : inet_addr ntohl 192.168.1.100\n",p[0],p[1],p[2],p[3]);
    printf("addr_host = %u\n",addr_host);
    return 0;
}

int main()
{
    int ret = 0;
    //ret = host_order();
    ret = net_order();
    return ret ;
}

编译之。

gcc -g  -o test_order test_order.c

跑一下。

[[email protected] test]# ./test_order
addr = 1677830336
c0      a8 1    64 : inet_addr 192.168.1.100
192     168  1  100 : inet_addr 192.168.1.100
64      1 a8    c0 : inet_addr ntohl 192.168.1.100
100     1  168  192 : inet_addr ntohl 192.168.1.100
addr_host = 3232235876

清晰明了。有助于快速理解。

原文地址:https://blog.51cto.com/qiaopeng688/2443790

时间: 2024-10-30 14:23:41

网络序,主机序学习的相关文章

[C++][转]CPU字节序 网络序 主机序 大端小端

原帖:http://www.cnblogs.com/darktime/p/3298075.html 不同的CPU有不同的字节序类型 这些字节序是指整数在内存中保存的顺序 这个叫做主机序最常见的有两种1. Little endian:将低序字节存储在起始地址2. Big endian:将高序字节存储在起始地址 LE little-endian最符合人的思维的字节序地址低位存储值的低位地址高位存储值的高位怎么讲是最符合人的思维的字节序,是因为从人的第一观感来说低位值小,就应该放在内存地址小的地方,也

网络字节序&amp;主机字节序

什么是字节序?是指整数在内存中保存的顺序.       字节序有两种:       a.Little endinan 低位存储在内存的低地址,高位存储在内存的高地址:       b.Big endian 高位存储在内存的低地址,低位存储在内存的高地址: 举个简单的例子: DWORD dwCount = 0x01020304;这样的一个双字节变量在内存中如下分布0013FF70  04 03 02 01 (注:实验结果取之 XPSP3 VC6.0,说明我的机器是Little endinan序)

测试网络字节序与主机序

#include <stdlib.h> #include <errno.h> #include <string.h> // memset zero #include <sys/types.h> #include <sys/socket.h> // AF_INET #include <arpa/inet.h> // inet_* 的头文件 #include <netinet/in.h> // struct sockaddr_

主机序和网络序以及使用例子

为什么存在这两个东西: 空中传输的字节的顺序即网络字节序为标准顺序,考虑到与协议的一致以及与同类其它平台产品的互通,在程序中发数据包时,将主机字节序转换为网络字节序,收数据包处将网络字 节序转换为主机字节序 网络程序开发时 或是跨平台开发时 应该注意保证只用一种字节序 不然两方的解释不一样就会产生bug 主机序: 不同的CPU有不同的字节序类型 这些字节序是指整数在内存中保存的顺序 这个叫做主机序 1. Little endian:将低序字节存储在起始地址  2. Big endian:将高序字

C++技术问题总结-第11篇 网络通信中主机序网络序

网络通信经常涉及到字节序转化,接下来理解主机序和网络序有什么异同. ①主机字节顺序HBO(Host Byte Order) 采用小头序(little-endian),从低到高的顺序存储. 低位字节排放在内存的低地址端,高位地址排放在高位地址端. ②网络字节顺序NBO(Network Byte Order) 采用大头序(big-endian),从高到低的顺序存储. 高位字节排放在内存的低地址端,低位地址排放在高位地址端. TCP/IP协议定义网络字节为big-endian. 举个例子,0x1234

网络与主机字节转换函数:htons ntohs htonl ntohl

网络与主机字节转换函数:htons ntohs htonl ntohl 网络字节序: 网络字节顺序是TCP/IP中规定好的一种数据表示格式,它与具体的CPU类型.操作系统等无关,从而可以保证数据在不同主机之间传输时能够被正确解释.网络字节顺序采用big endian(大端)排序方式. 注:网络字节序转化为主机字节序时,一定要注意是否需要转换.网络字节序是确定的. 大端与小端 大端:低地址存高位 —— 网络字节序/主机字节序 小端:高地址存低位 —— 主机字节序 网络字节序一定是大端的(网络上传输

先序中序求解二叉树(使用二叉查找树原理)

 二叉树的先序中序序列确定,二叉树也就确认了,但还原二叉树确实有点麻烦,要不断的遍历中序序列.后来学习了二叉查找树,发现了一个很巧的办法. 二叉查找树的特性是每个节点都有权值,其规律为左子节点小于父节点,右子节点大于父节点,其中序序列是有序的.如果我们把二叉树变成二叉查找树,就是要给每个子节点赋值,最简单的根据中序序列从0->赋值,现在我们来看看二叉查找树先序序列和二叉查找树的关系.以下树的中序序列为DBEGACF,附上权值为(D:0,B:1,E:2,G:3,A:4,C:5,F:6 ) 关于这个

二叉树先序中序非递归算法

一直想要写的 二叉树 中序 先序 后序遍历算法 当年学习DS最虚的就是这个,因为非递归算法复杂,测试数据不好弄,只能一个一个手动插入.感觉明显比图的难,虽然大家都觉得图更难..... 递归的太简单了,就不写了.关键是非递归版本. 先序: 我自己的版本: void RootPreTraverse(Node* p) { Stack S; while(S not empty) { p=S.top(); S.pop(); Show(p); if(p->right!=null) S.push(p->ri

算法实验-二叉树的创建和前序-中序-后序-层次 遍历

对于二叉树的创建我是利用先序遍历的序列进行创建 能够对于树节点的内容我定义为char型变量 '0'为空,即此处的节点不存在 头文件 Tree.h //链式二叉树的头文件 #pragma once #include<iostream> #include<queue> using namespace std; class BinaryTreeNode { public: char data; BinaryTreeNode *leftChild,*rightChild; BinaryTr