buffer與struct的轉換

2021-06-16 10:38:48 字數 1237 閱讀 5622

buffer就是一系列的01,對於程式設計師來說一點用處都沒有,而struct是c程式設計師的一把利器之一,之所以是利器,因為可以利用struct直接操縱buffer,比如拿到乙個乙太網的資料報,我們如何處理?如果沒有struct的話,我們只能用指標小心翼翼的偏移依次取每個字段。大概應該是這樣的。

unsigned char dest[6];

unsigned char src[6];

unsigned short type;

int len=0;

for(i=0; i<6; i++)

dest[i] = buffer[i];

for(i=0; i<6; i++);src[i] = buffer[i+6];type = (unsigned short )buffer[12];

咋一看不是很麻煩,但是一般在網路上傳輸的資料都是這樣的buffer,如果每次都需要這樣來操作的話,程式設計師大多都已經**身亡了。如果不想**身亡的話就只能求助於struct了。熟悉c語言都知道有個東西叫強轉,就是把一種資料型別強制轉換為另外一種資料型別,但是這樣的強轉需要保證資料的值的可傳遞性。比如你不能這麼幹:

int i;

int *p;

p=(int *)i;

*p = 123;

作業系統不會阻止你這麼幹,因為你已經動用了強轉的王牌了,課時你可真不能這麼幹,否則大禍臨頭!

好了,既然可以強轉了,那麼我定義乙個資料結構,然後把buffer強轉之後就可以了。

struct eth_header*eth_header;

eth_header = (struct eth_header *)buffer;

很美吧!雖然**量看似差不多,但是編過程的都知道這究竟有多美妙!

但是這裡面可不能隨意轉換,因為這涉及到位元組序問題,乙個struct的大小並不是結構成員的簡單相加,比如下面乙個結構:

struct str_tstr;
sizeof(str)的可是8哦,而不是5.

關於位元組序請參考:

所以,經常需要採用陣列來間接對齊,請參考下面例子。

附:arp資料結構

struct arp_hdr ;
所以很多人疑惑為什麼ip位址(4位元組)不直接用乙個int_32來存,而是用乙個資料結構,然後裡面又有乙個陣列。位元組對齊是很重要的因素。

NSData 與 struct 以及XML的轉換。

在做oc與c 混編的時候,我們可能會用到struct 與nsdata的相互轉換。在這裡做乙個記錄 1 struct轉換為nsdata 例如如下的struct struct tagpackagehead byte bstartcode uint icmd uint ixmllen uint iseqn...

Nodejs之Buffer資料轉ReadSteam

stream fs.createreadstream content.txt 返回乙個readstream 檔案讀取流,輸入流 物件。可讀流 fs.createreadstream不是用來做buffer到readstream的轉換的。雖然它接受乙個buffer,但buffer裡面放的仍然應該是乙個檔...

buffer 與cache 的區別

有句原文解釋的很好。a buffer is something that has yet to be written to disk.a cache is something that has been read from the disk and stored for later use.cach...