★快來看ddy的公告★
用Blog人氣換現金喔,係金A
只要用心經營Blog,不用四處拉人點廣告,詳請參考
使用BloggerAds 為Blog賺取實質收益 或點選
歡迎大家來關心社會上弱勢家庭的孩子,這裡有許多他們的創作與畫畫,請一起來關心這群孩子也鼓勵他們吧 強力推薦一個好站,希望森林,為您帶來人生的希望
個人檔案

ID:ddy1280
暱稱ddy
生日1975/03/16
地區桃園縣

部落格廣告


強力推薦,讓Blog的人氣轉換成現金,鼓勵Blog創作最佳的回饋方式,詳請見使用BloggerAds 為Blog賺取實質收益或點選上方圖片加入喔

基督徒串聯
隨機文章跑馬燈
Tags Cloud
搜尋此頻道內容
時光機器

謹民出生第

人氣指數
當日人次:
累積人次:
ddy 有多少客人
誰來我家
誰推薦我
我推薦誰
著作權條款
Creative Commons License
本部落格採用創用CC 2.5 TW授權條款釋出.重製,散布,展示本站內容,請遵守 姓名標示-非商業性-禁止改作
公益串聯
到台湾玩不带走一张发票
用愛彌補~羅慧夫顱顏基金會
我的書籤(選單)
時鐘

每月文章彙集
Jul 2008(4)
Jun 2008(4)
May 2008(6)
Apr 2008(6)
Mar 2008(9)
Feb 2008(6)
Jan 2008(11)
Dec 2007(13)
Nov 2007(16)
Oct 2007(7)
Sep 2007(1)
Aug 2007(10)
Jul 2007(5)
May 2007(6)
Apr 2007(13)
Mar 2007(10)
Feb 2007(2)
Jan 2007(4)
Dec 2006(14)
Nov 2006(5)
Oct 2006(11)
Sep 2006(8)
Aug 2006(10)
Jul 2006(15)
Jun 2006(16)
May 2006(14)
Apr 2006(15)
Mar 2006(17)
Feb 2006(9)
Jan 2006(20)
Dec 2005(18)
Nov 2005(18)
Oct 2005(30)
Sep 2005(21)
May 2005(5)
Apr 2005(22)
Mar 2005(17)
RSS 訂閱
RSS2
ATOM
贊助商
其它資訊
本部落所刊登之內容,皆由作者個人所提供,不代表 yam天空部落 本身立場。
CC授權
著作權說明文字
POWERED BY
POWERED BY
會員登入免費註冊
April 21, 2008
前二天一個初學C語言的朋友在問…這是什麼爛語言呀~~怎麼資料轉來轉去的…頭都昏了
我哈哈大笑之後…跟他解釋原理,他大概能接受了。
但我想許多對初學者而言,資料的轉換仍然是一個問題,在此整理一些函式說明如下:

大概分為三類
  1. 字串與數值轉換
  2. 位元順序轉換
  3. 網路位址轉換

字串與數值轉換
    常見的就是atoi(),atol(),atof(),itoa() ... 之類的,其中itoa() 不被gcc所支援,可透過sprintf()來實現轉換,並僅以atoi()與sprintf()為例
 
原型宣告 使用方法 使用時機
#include <stdlib.h>
int atoi (const char *str);
int a;
a=atoi("100");
將數值字串轉換成整數
#include <stdio.h>
int sprintf (char *str,const char *format,...);
char s[10];
sprintf(s,"%s",100);
將數值轉換為字串


位元順序轉換
    位元序序轉換是因為x86 cpu讀取記憶體的順序與磁碟上存放的順序不同而造成的,x86架構是所謂的Little-Endian,在磁碟上儲存的位元組是照順序的,然而以32位元記憶體存取而言,會先從低位元開始讀取,例如…在磁碟上存放的資料是0x12345678,那麼讀進記憶體之後,就會是0x78 0x56 0x34 0x12
所以,從在儲存媒體與記憶體之間的資料需要轉換。另外就是用於Host Byte Order 與 Network Byte Order 互換,因為網路跨平台的特性,無論主機端是Big-Endian 或是Little-Endian 都要能正確地透過網路交換資料,所以在Socket定義上,Network Byte Order 採用 Big-Endian 。以下函式可達成轉換:

#include <netinet/in.h>

uint32_t htonl(uint32_t hostlong);//32位元資料轉換
uint16_t htons(uint16_t hostshort);//16位元資料轉換
uint32_t ntohl(uint32_t netlong);
uint16_t ntohs(uint16_t netshort);



僅以host 中32位元記憶體中資料 0x78563412 為例:
原型宣告 使用方法 使用時機
#include <netinet/in.h>
uint32_t htonl(uint32_t hostlong);
unsigned int a,b;
a=0x78563412;
b=htonl(a);
1.host轉換成network 順序
2.memory 資料寫入磁碟的轉換
(0x78563412-->0x12345678)
#include <netinet/in.h>
uint32_t ntohl(uint32_t netlong);
unsigned int a,b;
b=0x12345678;
a=ntohl(b);
1.network 轉換成host順序
(0x12345678-->0x12345678)

網路位址轉換
    網路位址轉換是32位元IP值與IP字串的轉換,例如我們所輸入的IP 192.168.100.111 是一組字串,但是socket api 接受的是32位元IP值,所以需要轉換,或是從socket api 取得的32位元IP值,要轉換成可顯示的字串格式,可例用下列函式:
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>

char *inet_ntoa(struct in_addr in);
int inet_aton(const char *cp, struct in_addr *inp);
in_addr_t inet_addr(const char *cp);


原型宣告 使用方法 使用時機
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
char *inet_ntoa(struct in_addr in);
char ipbuf[16];
struct in_addr addr;
addr.s_addr =0xC0A86401;
sprintf(ipbuf,"%s",inet_ntoa(addr));
32位元IP Address 轉換為IP字串

            
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
int inet_aton(const char *cp, \
struct in_addr *
inp);
struct in_addr addr;
unsigned int ip;
ip=inet_aton("192.168.100,1",&addr);

IP字串轉換為32位元IP Address

誰推薦這篇文章
引用 (你可以針對此文寫一篇屬於自己的blog/想法,並給作者一個通告)
引用
相關閱讀
留言 (1筆)
1.
太深奧了。。。。@_@ 。。。。 \("▔□▔)/ 。。。Orz

這是神的領域了嗎????
 
板主回覆:
還好啦…隔行如隔山…其實這的沒有什麼~~^^
catyaling 2008-04-26 00:56:39 留言 |
發表你的留言 (字數限制 最多 2000 個中文字)

Name:






內容:

請輸入下圖所顯示的英文字母: