日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

c语言高低位拷贝_C语言中的大小端转换与高低位颠倒

發布時間:2025/3/15 编程问答 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 c语言高低位拷贝_C语言中的大小端转换与高低位颠倒 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

總結一下最近工作學到的東西,主要是關于大小端與高低位。

在說大小端高低位之前,肯定要說明數據在計算機內是如何存儲的。在計算機中,我們將數據分割成了一個一個的字節(byte),而每個字節又有8位(bit)。

一個字節,可以聲明為unsigned

char型數據,但是有時候不夠用,畢竟一個UCHAR也就能表示0-255的數據。所以還會有short型(2字節),int型(4字節),浮點型float(4字節),double型(8字節)等等。其實存在計算機里,數據都還是那些個數據,只是讀寫的方式因為聲明的不同而不同。就好比是一句話一共14個字:今天天氣特別好呀我們出去玩吧!假如一個字就是一個字節,那么UCHAR型,我們就是這樣從計算機中讀寫的:今

天 天 氣 特 別 好 呀 我 們 出 去 玩 吧!

Int型是這樣讀寫的:今天天氣

特別好呀 我們出去 玩吧!這些數據在計算機的物理地址上是連續存儲的,只是如果我們拿著int型的聲明,就硬生生的,一次只能讀寫4個字節,多一點少一點都不行。就像是那個少一天一秒都不是一輩子的梗一樣……

數據都是那些數據,但是有些計算機把值的低位存在低地址,這是小端(little endian)。有些計算機把值的高位存在低地址,這是大端(big endian)。不同CPU廠商大小端又不統一,例如,Motorala6800, PowerPC970等是大端,x86,VAX等是小端。這就要求不同計算機在交互的過程中可能需要進行大小端轉換。我之前看了很多帖子學這個的時候有人吐槽說TCP/IP規定使用大端字節序為網絡字節序非常任性……

下面貼代碼,原理都一樣,非常簡單,我把short,int,float,double型全貼上以造福以后的懶人。除了double那個都在VC6.0下跑過,可以復制黏貼直接用~

short型:

unsigned short swapShort16(unsigned short

shortValue){

return ((shortValue & 0x00FF )

<<8) | ((shortValue & 0xFF00)>>8);

}

int 型(原理都一樣!):

int swapInt32(int intValue){

int temp = 0;

temp = ((intValue & 0x000000FF) <<24)

+

((intValue & 0x0000FF00) <<8)

+

((intValue & 0x00FF000) >>8)

+

((intValue & 0xFF000000) >>24);

return temp;

}

不過float型略有不同,稍微麻煩一點,還需要建一個聯合體。這個聯合體建立是因為,雖然我們拿著int 型和float型的牌子去找計算機要數據,計算機都給我們四個字節沒錯。但是它給的方式不同。所以我們要將float型變成int型(不能強制轉換傻孩子)然后再進行顛倒。聯合體超級好用,我覺得它體現了數據存儲的本質,你可以選擇一萬種方式讀寫,但是其實數據在聯合體肚子里都是一樣一樣的。

float型:

float swapFloat32(float floatValue){

typedef union SWAP_UNION{

float unionFloat;

int

unionInt;

}SWAP_UNION;

SWAP_UNION swapUnion;

swapUnion.unionFloat = floatValue;

swapUnion.unionInt = swapInt32(

swapUnion.unionInt);

return

swapUnion.unionFloat;

}

double型換一種寫法,用一下指針,不然移位移死了……

void swapDouble64(unsigned char *pIn, unsigned char

*pOut){

for( int i=0;i<8;i++)

pOut[7-i] = pIn[i];

}

王德福啊,連return都不用了。

關于高低位,雖然通常不用顛倒,該取反取反就行,但是保不齊哪天碰到個什么事情就叫你把一個字節的高低位顛倒一下。反正我就碰到了。一開始覺得這怎么辦,系統給了取反你非叫我顛倒,后來想想也是用笨辦法就這樣移位顛嘛~

Unsigned char bitRevise(unsigned char bitInfo){

Unsigned char bitReturn;

bitReturn = (bitInfo & 0x80)>>7|

(bitInfo

& 0x40)>>5|

(bitInfo &

0x20)>>3|

(bitInfo & 0x10)>>1|

(bitInfo &

0x8)<<1|

(bitInfo &

0x4)<<3|

(bitInfo & 0x2)<<5|

(bitInfo &

0x1)<<7;

Return bitReturn;

}

月中的時候我告訴自己每個月應該堅持寫一篇博客把自己學到的東西記下來,說不定將來要跳槽呢……今天29號了……不知道還有沒有下一篇哈哈哈哈。

總結

以上是生活随笔為你收集整理的c语言高低位拷贝_C语言中的大小端转换与高低位颠倒的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。