對網路序和主機序的理解
最近在搞VoIP,在閱讀別人的原始碼時發現了IP地址轉換過程中的問題,寫下筆記。
經驗如下:
1、點分十進位制IP,輸入時以字串的形式讀入;
2、正統的IP地址儲存用 struct in_addr 定義資料結構進行儲存;
3、點分十進位制IP轉化為無符號長整形IP用inet_addr()函式;點分十進位制轉化為struct in_addr結構的網路序IP用inet_aton()反向轉化用inet_ntoa()函式,linux下需要包含兩個標頭檔案:
#include<arpa/inet.h>
#include<netinet/in.h>
4、無符號長整形IP要儲存到in_addr結構體中,可以用memcpy(&addr1,&ulip,4);其中addr1是struct in_addr 結構體,ulip是無符號長整形,inet_ntoa()
5、無符號長整形主機序轉網路序用htonl()函式,反向用ntohl()函式;這兩個函式遵循負負得正規律。短整型網路位元組序轉換用htons()和ntohs();
6、in_addr結構體定義如下:
7、例項程式碼和演示結果如下:struct in_addr { union { struct { u_char s_b1,s_b2,s_b3,s_b4; } S_un_b; struct { u_short s_w1,s_w2; } S_un_w; u_long S_addr; } S_un; };
/************************************************************************* > File Name: ipStringTest.c > Author: SunHao > Mail: [email protected] > Created Time: 2014年11月26日 星期三 15時32分01秒 ************************************************************************/ #include<stdio.h> #include<arpa/inet.h> #include<netinet/in.h> #include<string.h> int main() { char ipStr[50]; unsigned long ip; unsigned long ulip; struct in_addr addr1; while(1) { printf("input ip addr:\n"); scanf("%s",ipStr); ip=inet_addr(ipStr); printf ("your input ip is:\t%s\n",ipStr); ulip=ip; memcpy(&addr1,&ulip,4); printf("the inet_addr ip:\t\t%x\t%s\n",ulip,inet_ntoa(addr1)); ulip=htonl(ip); memcpy(&addr1,&ulip,4); printf("the inet_addr htonl ip:\t\t%x\t%s\n",ulip,inet_ntoa(addr1)); ulip=ntohl(ulip); memcpy(&addr1,&ulip,4); printf("the inet_addr ntohl ip:\t\t%x\t%s\n",ulip,inet_ntoa(addr1)); ulip=htonl(htonl(ip)); memcpy(&addr1,&ulip,4); printf("the inet_addr htonl*2 ip:\t%x\t%s\n",ulip,inet_ntoa(addr1)); } }
執行結果如下:
input ip addr:
172.16.15.249
your input ip is: 172.16.15.249
the inet_addr ip: f90f10ac 172.16.15.249
the inet_addr htonl ip: ac100ff9 249.15.16.172
the inet_addr ntohl ip: f90f10ac 172.16.15.249
the inet_addr htonl*2 ip: f90f10ac 172.16.15.249
input ip addr:
相關推薦
對網路序和主機序的理解
最近在搞VoIP,在閱讀別人的原始碼時發現了IP地址轉換過程中的問題,寫下筆記。 經驗如下: 1、點分十進位制IP,輸入時以字串的形式讀入; 2、正統的IP地址儲存用 struct in_addr 定義資料結構進行儲存; 3、點分十進位制IP轉化為無符號長整形IP用inet
網路位元組序和主機位元組序
不同的CPU有不同的位元組序型別 這些位元組序是指整數在記憶體中儲存的順序 這個叫做主機序最常見的有兩種1. Little endian:將低序位元組儲存在起始地址2. Big endian:將高序位元組儲存在起始地址LE little-endian 最符合人的思維的位元組序地址低位儲存值的低位地址高位儲存值
網路位元組序和主機位元組序詳解!!!
我們都知道,如今的通訊方式已經趨向與多樣化,異構通訊(計算機軟體(作業系統) + 計算機硬體(核心架構,ARM,x86)不同)也已經很普遍了,如,手機和電腦中的qq進行通訊,,, 同時,在計算
建立一棵用二叉樹連結串列方式儲存的二叉樹,並對其進行遍歷(先序,中序和後序),列印輸出遍歷結果
題目如下 程式碼如下 #include<stdio.h> #include<stdlib.h> #include<malloc.h> typedef struct Node//結構體 {
刷SICP遇到的問題——深入學習理解正則序和應用序
仔細思考了SICP的練習1.5,對正則序和應用序產生了越來越多的問題,這篇部落格不提供解答,只記錄了一些自己的疑惑和思考 最常見的一種正則序應用序的定義方式是,正則序是先展開後規約,應用序是先求值再應用 對於這個定義,產生了幾個問題如下: 展開到什麼程度 什麼順序展開
(1)建立二叉樹的二叉連結串列。 (2)寫出對用二叉連結串列儲存的二叉樹進行先序、中序和後序遍歷的遞迴和非遞迴演算法。 (3)寫出對用二叉連結串列儲存的二叉樹進行層次遍歷演算法。 (4)求二叉樹的所有葉子及結點總數。
(1)建立二叉樹的二叉連結串列。 (2)寫出對用二叉連結串列儲存的二叉樹進行先序、中序和後序遍歷的遞迴和非遞迴演算法。 (3)寫出對用二叉連結串列儲存的二叉樹進行層次遍歷演算法。(4)求二叉樹的所有葉子及結點總數。 include<stdio.h> #inclu
給出二叉樹的先序和中序遍歷,給出後序遍歷
logs __main__ font class pre span 思想 style 輸出 實現一個功能: 輸入:一顆二叉樹的先序和中序遍歷 輸出:後續遍歷思想: 先序遍歷中,第一個元素是樹根 在中序遍歷中找到樹根,左邊的是左子樹 右邊的是右子樹
UVA - 10410 Tree Reconstruction (根據dfs序和bfs序恢復一顆樹)
bsp int clu pan n) printf pri 完全 scanf 題意: 分析: 這題一開始完全沒有思路, 一直沒有找出規律。 參考了http://www.cnblogs.com/Wade-/p/6358859.html 和 http://www.cnblog
數據結構 遞歸和非遞歸方式實現二叉樹先序、中序和後序遍歷
nor post 後序遍歷 order else 對象 二叉樹先序 bre print 二叉樹的先序遍歷順序是根、左、右;中序遍歷順序是左、根、右;後序遍歷順序是左、右、根。 遞歸方式實現如下: 1 public class TreeNode { 2
C++實現利用(前序和中序生成二叉樹)以及(二叉樹的鏡像)
lse pub 非遞歸 ace 方法 [] reorder spa push #include<iostream> #include<string.h> #include<stack> using namespace std; type
樹的遍歷之----先序,中序,後序和層序遍歷
1先序、中序、後序遍歷(遞迴實現) 先序遍歷:中 左 右 中序遍歷:左 中 右 後序遍歷:左 右 中 public static class Node { public int value; public Node left; public Node right;
Uva536 Tree Recovery二叉樹重建(先序和中序確定二叉樹,後序輸出)
題目大意:給定二叉樹先序和中序遍歷,輸出二叉樹後序遍歷。 方法:將英文字母對映為數字,利用陣列儲存,先序第一個節點是父節點,然後再從中序遍歷中找到位置。注意邊界。程式碼也很簡單一次ac。 #include<iostream> #include <string> #in
對於給定的先序和中旬或者中序和後序重建樹
//根據先序遍歷結果和中序遍歷結果確定唯一的二叉樹,根據中序遍歷結果和後序遍歷結果確定唯一的二叉樹 import java.util.*; public class Rebuild_Tree { public static void main(String args[]){
LeetCode105 樹·從前序和中序序列構造二叉樹(C++)
題目描述: 根據一棵樹的前序遍歷與中序遍歷構造二叉樹。 注意:你可以假設樹中沒有重複的元素。 例如,給出 前序遍歷 preorder = [3,9,20,15,7] 中序遍歷 inorder = [9,3,15,20,7] 返回如下的二叉樹: 3 / \ 9 2
LeetCode106 樹·從中序和後序序列構造二叉樹(C++)
題目描述: 根據一棵樹的中序遍歷與後序遍歷構造二叉樹。 注意:你可以假設樹中沒有重複的元素。 例如,給出 中序遍歷 inorder = [9,3,15,20,7] 後序遍歷 postorder = [9,15,7,20,3] 返回如下的二叉樹: 3 / \ 9
c++二叉樹的遞迴和非遞迴的前序中序和後序遍歷以及層序遍歷
二叉樹的遞迴版的前序,中序和後序遍歷很簡單也很容易理解,這裡就放一個前序遍歷的例子 //前序遍歷遞迴演算法,遞迴演算法都大同小異,這裡就不一一列舉了 void binaryTree::pro_order(NodeStack::Node *t) { NodeStack::Node *h = t;
第六章樹和二叉樹作業1—二叉樹--計算機17級 7-1 根據後序和中序遍歷輸出先序遍歷 (25 分)
7-1 根據後序和中序遍歷輸出先序遍歷 (25 分) 本題要求根據給定的一棵二叉樹的後序遍歷和中序遍歷結果,輸出該樹的先序遍歷結果。 輸入格式: 第一行給出正整數N(≤30),是樹中結點的個數。隨後兩行,每行給出N個整數,分別對應後序遍歷和中序遍歷結果,數字間以空
對Spring Ioc和AOP的理解
轉載自:https://blog.csdn.net/u013148153/article/details/80293587 Ioc和AOP是Spring的兩大核心,面試的時候也經常被問及對這兩個概念的理解,因此也記下我對此的理解,方便以後查漏補缺。 一、控制反轉(Ioc,
根據先序和中序(中序和後序)確定二叉樹
實在是恨自己智商欠費,一個二叉樹搞了好長時間才弄清!!! 怎樣通過先序和中序確定二叉樹? 我的演算法設計思路參考學習網上的,但程式碼是自己實現的,其實還是在建立二叉樹的基礎上新增一些條件。我們剛開始根據先序序列中第一個資料,在中序序列中找與該結點資料相等的與元素,將中序序列中該元素所在下標返
二叉樹的遞迴遍歷(先序、中序和後序)
[前文] 二叉樹的遞迴遍歷包括 先序遍歷、中序遍歷 和 後續遍歷。 如下圖所示的二叉樹: 前序遍歷順序為:ABCDE (先訪問根節點,然後先序遍歷其左子樹,最後先序遍歷其右子樹) 中序遍歷順序為:CBDAE (先中序遍歷其左子樹,然後訪