日日操夜夜添-日日操影院-日日草夜夜操-日日干干-精品一区二区三区波多野结衣-精品一区二区三区高清免费不卡

公告:魔扣目錄網(wǎng)為廣大站長(zhǎng)提供免費(fèi)收錄網(wǎng)站服務(wù),提交前請(qǐng)做好本站友鏈:【 網(wǎng)站目錄:http://www.ylptlb.cn 】, 免友鏈快審服務(wù)(50元/站),

點(diǎn)擊這里在線咨詢客服
新站提交
  • 網(wǎng)站:51998
  • 待審:31
  • 小程序:12
  • 文章:1030137
  • 會(huì)員:747

作者:薛8

來(lái)源:https://ddnd.cn/2019/02/16/byte-hex-ascii/

前言

最近在學(xué)習(xí)中涉及到計(jì)算機(jī)儲(chǔ)存、傳輸數(shù)字和字符等操作,由于對(duì)字節(jié)、2進(jìn)制、10進(jìn)制、16進(jìn)制、ASCII碼的概念以及它們之間的關(guān)系和轉(zhuǎn)換理解的不夠透徹,導(dǎo)致在通訊、MD5消息摘要算法等時(shí)候出現(xiàn)問(wèn)題,是因?yàn)?strong>數(shù)據(jù)轉(zhuǎn)成計(jì)算機(jī)認(rèn)識(shí)的01的這個(gè)環(huán)節(jié)出現(xiàn)問(wèn)題。由于這個(gè)問(wèn)題并不是那么容易發(fā)現(xiàn),所以我也算是花了挺多時(shí)間才解決了這個(gè)問(wèn)題,記錄下解決過(guò)程,順便也當(dāng)復(fù)習(xí)一下計(jì)算機(jī)組成原理。

ASCII碼

在計(jì)算機(jī)中,所有的數(shù)據(jù)在存儲(chǔ)和運(yùn)算時(shí)都要使用二進(jìn)制數(shù)表示(因?yàn)橛?jì)算機(jī)用高電平和低電平分別表示1和0),例如,像a、b、c、d這樣的52個(gè)字母(包括大寫)以及0、1等數(shù)字還有一些常用的符號(hào)(例如*、#、@等)在計(jì)算機(jī)中存儲(chǔ)時(shí)也要使用二進(jìn)制數(shù)來(lái)表示,而具體用哪些二進(jìn)制數(shù)字表示哪個(gè)符號(hào),當(dāng)然每個(gè)人都可以約定自己的一套(這就叫編碼),而大家如果要想互相通信而不造成混亂,那么大家就必須使用相同的編碼規(guī)則,于是美國(guó)有關(guān)的標(biāo)準(zhǔn)化組織就出臺(tái)了ASCII編碼,統(tǒng)一規(guī)定了上述常用符號(hào)用哪些二進(jìn)制數(shù)來(lái)表示。
ASCII 碼一共規(guī)定了128個(gè)字符(0000 0000-0111 1111)的編碼,比如空格SPACE是32(二進(jìn)制0010 0000),大寫的字母A是65(二進(jìn)制0100 0001 )。這128個(gè)符號(hào)(包括32個(gè)不能打印出來(lái)的控制符號(hào)),只占用了一個(gè)字節(jié)的后面7位(低7位),最前面的一位(高1位)統(tǒng)一規(guī)定為0(不要和數(shù)字的符號(hào)位搞混)。
當(dāng)然除了ASCII碼,還有UTF-8、GBK等。

字節(jié)

字節(jié)(Byte)普通計(jì)算機(jī)系統(tǒng)能讀取和定位到最小信息單位,即我們通過(guò)計(jì)算機(jī)儲(chǔ)存和傳輸數(shù)據(jù)的時(shí)候都是先把數(shù)據(jù)轉(zhuǎn)成字節(jié)。
字節(jié)即Byte,一個(gè)字節(jié)代表8個(gè)比特(Bit),字節(jié)通常縮寫為B,比特通常縮寫為b。字節(jié)的大小是8Bit,即字節(jié)的范圍是0000 0000 - 1111 1111,對(duì)于無(wú)符號(hào)型,它表示的十進(jìn)制范圍是[0,255],對(duì)于有符號(hào)型,高一位表示符號(hào)位,它表示的十進(jìn)制范圍是[-128,127]。

計(jì)算機(jī)若何儲(chǔ)存數(shù)據(jù)

計(jì)算機(jī)只認(rèn)識(shí)0和1(因?yàn)橛?jì)算機(jī)只有高低電平兩個(gè)狀態(tài)),數(shù)據(jù)要想通過(guò)計(jì)算機(jī)儲(chǔ)存或者傳輸,首先是要把數(shù)據(jù)轉(zhuǎn)成計(jì)算機(jī)能認(rèn)識(shí)的格式即01數(shù)據(jù)。
我們舉個(gè)例子,以儲(chǔ)存十進(jìn)制數(shù)字28和-28為例,首先將十進(jìn)制數(shù)轉(zhuǎn)成二進(jìn)制。

需要注意的是: 數(shù)字在計(jì)算機(jī)中儲(chǔ)存的是補(bǔ)碼,而字符是在計(jì)算機(jī)中儲(chǔ)存的是字符對(duì)應(yīng)的編碼(不要和數(shù)字的補(bǔ)碼搞混)。

數(shù)字

儲(chǔ)存十進(jìn)制數(shù)字28和-28為例,首先將十進(jìn)制數(shù)轉(zhuǎn)成二進(jìn)制,高1位為0代表正數(shù),為1代表負(fù)數(shù)

28(10) = 0001 1100(2)(原碼)

-28(10) = 1001 1100(2)(原碼)

然后計(jì)算機(jī)將二進(jìn)制數(shù)字進(jìn)行補(bǔ)碼運(yùn)算,運(yùn)算結(jié)果如下

28(10) = 0001 1100(2)(原碼) = 0001 1100(2)(補(bǔ)碼)

-28(10) = 1001 1100(2)(原碼) = 1110 0100(2)(補(bǔ)碼)

然后計(jì)算機(jī)保存的就是補(bǔ)碼,當(dāng)要取出數(shù)據(jù)的時(shí)候,就將補(bǔ)碼逆運(yùn)算一下,即可求出原碼,再將原碼轉(zhuǎn)換一下就可以得到真實(shí)的數(shù)據(jù)了。
下面以JAVA語(yǔ)言演示這個(gè)過(guò)程,首先我們要清楚Java的byte、short、int、long都是有符號(hào)的(signed)

計(jì)算機(jī)儲(chǔ)存數(shù)字和字符的方法你了解多少?

 

運(yùn)行輸出:

28儲(chǔ)存到計(jì)算機(jī)后為:11100

-28儲(chǔ)存到計(jì)算機(jī)后為:11111111111111111111111111100100

取出儲(chǔ)存的28 以無(wú)符號(hào)表示:28

取出儲(chǔ)存的-28 以無(wú)符號(hào)表示:4294967268

我們驗(yàn)證一下結(jié)果,驗(yàn)證了計(jì)算機(jī)確實(shí)是以補(bǔ)碼的方式儲(chǔ)存數(shù)字。這里有個(gè)小問(wèn)題,就是我們知道int型有4個(gè)字節(jié)即32個(gè)比特,但是28卻輸出了111005個(gè)比特而已,是因?yàn)閠oBinaryString()方法把11100前面的0給忽略了。
取出的時(shí)候,我們以無(wú)符號(hào)的標(biāo)準(zhǔn)去處理,導(dǎo)致取出存入的-28結(jié)果是4294967268和我們存入的不一樣,這是因?yàn)?28是負(fù)數(shù),負(fù)數(shù)的補(bǔ)碼和原碼不一樣,而用無(wú)符號(hào)處理的話就是直接將11111111111111111111111111100100轉(zhuǎn)成結(jié)果了。而為什么28用有無(wú)符號(hào)處理結(jié)果都一樣是因?yàn)檎龜?shù)的原碼和補(bǔ)碼一樣,這樣驗(yàn)證了Java的數(shù)據(jù)類型都是有符號(hào)的。

至于計(jì)算機(jī)為什么用補(bǔ)碼來(lái)儲(chǔ)存數(shù)字,而不是原碼,原因是:
拿單字節(jié)整數(shù)來(lái)說(shuō),無(wú)符號(hào)型,其表示范圍是[0,255],總共表示了256個(gè)數(shù)據(jù)。有符號(hào)型,其表示范圍是[-128,127]。
先看無(wú)符號(hào),原碼和補(bǔ)碼都一樣,0表示為0000 0000,255表示為1111 1111,剛好滿足了要求,可以表示256個(gè)數(shù)據(jù)。
再看有符號(hào)的,若是用原碼表示,0表示為0000 000。因?yàn)樵蹅冇蟹?hào),所以應(yīng)該也有個(gè)負(fù)0(雖然它還是0)1000 0000。這樣的話那就有2個(gè)0,也就是只能表示255個(gè)數(shù)據(jù),不能夠滿足我們的要求。而用補(bǔ)碼則很好的解決了這個(gè)問(wèn)題。

字符

在計(jì)算機(jī)中,對(duì)非數(shù)值的字符進(jìn)行處理時(shí),要對(duì)字符進(jìn)行數(shù)字化,即用二進(jìn)制編碼來(lái)表示字符。其中西文字符最常用到的編碼方案有ASCII編碼和EBCDIC編碼。對(duì)于漢字,我國(guó)也制定的相應(yīng)的編碼方案,比如 GBK,GB2312等。
比如字符a的ASCII碼十進(jìn)制值為97,在計(jì)算機(jī)中用二進(jìn)制表示就是 01100001。下面同樣用Java來(lái)演示計(jì)算機(jī)是如何儲(chǔ)存字符的。

  1. 采用UTF-8和GBK兩種編碼儲(chǔ)存漢字
計(jì)算機(jī)儲(chǔ)存數(shù)字和字符的方法你了解多少?

 


計(jì)算機(jī)儲(chǔ)存數(shù)字和字符的方法你了解多少?

 


我們調(diào)試看看,發(fā)現(xiàn)GBK編碼采用2個(gè)字節(jié)儲(chǔ)存,儲(chǔ)存的數(shù)據(jù)分別是10進(jìn)制的-42和-48對(duì)應(yīng)的二進(jìn)制分別是11010110和11010000(補(bǔ)碼),即漢字中對(duì)應(yīng)的二進(jìn)制為1101011011010000,即16進(jìn)制的D6D0,查看GBK對(duì)照表,發(fā)現(xiàn)16進(jìn)制編碼D6D0對(duì)應(yīng)的漢字確實(shí)是中

計(jì)算機(jī)儲(chǔ)存數(shù)字和字符的方法你了解多少?

 

而UTF-8編碼采用3個(gè)字節(jié)儲(chǔ)存,同理將對(duì)應(yīng)的二進(jìn)制111001001011100010101101轉(zhuǎn)成16進(jìn)制,為E4B8AD,通過(guò)UTF-8編碼查詢,發(fā)現(xiàn)漢字中對(duì)應(yīng)的16進(jìn)制編碼確實(shí)是E4B8AD
 

計(jì)算機(jī)儲(chǔ)存數(shù)字和字符的方法你了解多少?

 

  1. 儲(chǔ)存字符
計(jì)算機(jī)儲(chǔ)存數(shù)字和字符的方法你了解多少?

 


計(jì)算機(jī)儲(chǔ)存數(shù)字和字符的方法你了解多少?

 


調(diào)試看看,字符串EF有E和F兩個(gè)字符,它們對(duì)應(yīng)的十進(jìn)制ASCII碼分別是69和70

計(jì)算機(jī)儲(chǔ)存數(shù)字和字符的方法你了解多少?

 

我們發(fā)現(xiàn)Java的getBytes()方法是將字符串的每一個(gè)字符都儲(chǔ)存到一個(gè)字節(jié)的,如果我們想把EF儲(chǔ)存在一個(gè)字節(jié)里面,即EF是一個(gè)整體的,一個(gè)字節(jié),不能拆分,那我們可以把EF放在一個(gè)字節(jié)里面(byte)(0xEF),聲明它是一個(gè)字節(jié),不是字符,不用再將它轉(zhuǎn)成字符對(duì)應(yīng)的編碼。
下面說(shuō)說(shuō)我在進(jìn)行MD5消息摘要算法時(shí)候遇到的坑,我要對(duì)QQ號(hào)對(duì)應(yīng)的Hex進(jìn)行MD5算法散列,這里我舉例QQ號(hào)的10進(jìn)制為12345678,對(duì)應(yīng)的16進(jìn)制為00BC614E(因?yàn)镼Q號(hào)固定長(zhǎng)度4個(gè)字節(jié),所以前面補(bǔ)了2個(gè)0),一開(kāi)始我是以下面的方式進(jìn)行MD5算法的

計(jì)算機(jī)儲(chǔ)存數(shù)字和字符的方法你了解多少?

 


計(jì)算機(jī)儲(chǔ)存數(shù)字和字符的方法你了解多少?

 


調(diào)試可以看到上面的代碼其實(shí)是將字符串00BC614E轉(zhuǎn)成了8個(gè)字節(jié),然后再對(duì)這8個(gè)字節(jié)進(jìn)行散列,這也是基于字符串進(jìn)行的MD5散列,和通過(guò)網(wǎng)上一些網(wǎng)站散列得到的值是一樣的

計(jì)算機(jī)儲(chǔ)存數(shù)字和字符的方法你了解多少?

 

但是這個(gè)哈希值和預(yù)想的結(jié)果不一致,后來(lái)才知道預(yù)想的結(jié)果是基于字節(jié)進(jìn)行的MD5散列,也就是00BC614E應(yīng)該分成4個(gè)字節(jié)(00、BC、61、4E)而不是8個(gè)字節(jié)(0、0、B、C、6、1、4、E),然后通過(guò)修改代碼

計(jì)算機(jī)儲(chǔ)存數(shù)字和字符的方法你了解多少?

 


計(jì)算機(jī)儲(chǔ)存數(shù)字和字符的方法你了解多少?

 


使用(byte)聲明是一個(gè)字節(jié),不是字符,不用再將它轉(zhuǎn)成字符對(duì)應(yīng)的編碼。00、BC、61、4E分別是一個(gè)字節(jié),當(dāng)然因?yàn)樽止?jié)為8個(gè)比特,能表示256個(gè)數(shù)字,因?yàn)镴ava的數(shù)據(jù)類型是有符號(hào)的,所以8個(gè)比特能表示的10進(jìn)制范圍是[-128,127],所以(byte)(x) x不能小于-128和不能大于127,否則會(huì)溢出,溢出的部分?jǐn)?shù)據(jù)會(huì)丟失。

分享到:
標(biāo)簽:儲(chǔ)存
用戶無(wú)頭像

網(wǎng)友整理

注冊(cè)時(shí)間:

網(wǎng)站:5 個(gè)   小程序:0 個(gè)  文章:12 篇

  • 51998

    網(wǎng)站

  • 12

    小程序

  • 1030137

    文章

  • 747

    會(huì)員

趕快注冊(cè)賬號(hào),推廣您的網(wǎng)站吧!
最新入駐小程序

數(shù)獨(dú)大挑戰(zhàn)2018-06-03

數(shù)獨(dú)一種數(shù)學(xué)游戲,玩家需要根據(jù)9

答題星2018-06-03

您可以通過(guò)答題星輕松地創(chuàng)建試卷

全階人生考試2018-06-03

各種考試題,題庫(kù),初中,高中,大學(xué)四六

運(yùn)動(dòng)步數(shù)有氧達(dá)人2018-06-03

記錄運(yùn)動(dòng)步數(shù),積累氧氣值。還可偷

每日養(yǎng)生app2018-06-03

每日養(yǎng)生,天天健康

體育訓(xùn)練成績(jī)?cè)u(píng)定2018-06-03

通用課目體育訓(xùn)練成績(jī)?cè)u(píng)定