摘要:它是按以下方式工作的。對(duì)已填充的二進(jìn)制進(jìn)行編碼時(shí),任何完全填充不包括原始數(shù)組中的位的位組都有特殊的第個(gè)符號(hào)表示。剩下的兩個(gè)位組都是填充碼,用來(lái)表示。最新的瀏覽器提供了自動(dòng)生成的方法和希望此文可以幫助你完全理解。
HTTP將BASE64-編碼用于基本認(rèn)證和摘要認(rèn)證,在幾種HTTP擴(kuò)展中也使用了該編碼。
Base-64編碼保證了二進(jìn)制數(shù)據(jù)的安全Base-64編碼可以將任意一組字節(jié)轉(zhuǎn)換為較長(zhǎng)的常見文本字符序列,從而可以合法地作為首部字段值。Base-64編碼將用戶輸入或二進(jìn)制數(shù)據(jù),打包成一種安全格式,將其作為HTTP首部字段的值發(fā)送出去,而無(wú)須擔(dān)心其中包含會(huì)破壞HTTP分析程序的冒號(hào)、換行符或二進(jìn)制值。
Base-64編碼是作為MIME多媒體電子郵件標(biāo)準(zhǔn)的一部分開發(fā)的,這樣MIME就可以在不同的合法電子郵件網(wǎng)關(guān)之間傳輸富文本和任意的二進(jìn)制數(shù)據(jù)里。Base-64編碼與將二進(jìn)制數(shù)據(jù)文本化表示的uuencode和BinHex標(biāo)準(zhǔn)在本質(zhì)上類似,但空間效率更高。
Base-64編碼將一個(gè)8位子節(jié)序列拆散為6位的片段,并為每個(gè)6位的片短分配一個(gè)字符,這個(gè)字符是Base-64字母表中的64個(gè)字符之一。這64個(gè)輸出字符都是很常見的,可以安全地放在HTTP首部字段中。這64個(gè)字符中包括大小寫字母、數(shù)字、+和/,還是用里特殊字符=。
注意:由于base64編碼用了8位字符來(lái)表示信息中的6個(gè)位,所以base64編碼字符串大約比原始值擴(kuò)大了33%。
此處輸入圖片的描述
下面是一個(gè)簡(jiǎn)單的base64編碼實(shí)例。在這里,三個(gè)字符組成的輸入值“Ow!”是base64編碼的,得到的是4個(gè)字符的base64編碼值“T3ch”。它是按以下方式工作的。
(1) 字符串"Ow!"被拆分成3個(gè)8位的字節(jié)(0x4F、0x77、0x21)。
(2) 這3個(gè)字節(jié)構(gòu)成了一個(gè)24為的二進(jìn)制01001111 01110111 00100001。
(3) 這些為被劃分為一些6位的序列010011、110111、011100、1000001.
(4) 每個(gè)6位值都表示了從0~63之間的數(shù)字,對(duì)應(yīng)base64字母表中的64個(gè)字符之一。得到的base64編碼字符串是4個(gè)字符的字符串“T3ch”。然后就可以通過(guò)線路將這個(gè)字符串作為“安全的”8位字符傳送出去,因?yàn)橹挥昧艘恍┮浦残宰詈玫淖址?字母、數(shù)字等)。
// 現(xiàn)在將字符串"Ow!"轉(zhuǎn)換為base64編碼值 var str = "Ow!"; // 或去字符串的二進(jìn)制碼 var binary = []; for (var i = 0; i < str.length; i++) { // 轉(zhuǎn)換為二進(jìn)制表示 var binStr = str.charCodeAt(i).toString(2); // 將得到的二進(jìn)制放入數(shù)組中得到 // ["1001111","1110111","100001"] // 因?yàn)橐粋€(gè)正常的二進(jìn)制字節(jié)都是由8bit組成的,不夠8bit的話不表示.上面得到的都不夠8bit所以前面我們手動(dòng)給補(bǔ)0,就得到了 // ["01001111","01110111","00100001"] binary.push(binStr); } // 1 把字符串按照6位分開,進(jìn)行分割,得到["010011","110111","011100","1000001"] // 2 將每一個(gè)轉(zhuǎn)換為十進(jìn)制分別對(duì)于[19,55,28,33]; // 3 將每一位數(shù)字分別對(duì)于上面提供的base64對(duì)應(yīng)表,得到對(duì)應(yīng)的編碼,分別對(duì)于 T 3 c h // 4 最后就會(huì)得到base64編碼T3ch console.log("字符"Ow!"最后得到的base64編碼為"T3ch"");base64填充
base64編碼收到一個(gè)8位字節(jié)序列,將這個(gè)二進(jìn)制序列流劃分成6位的塊。二進(jìn)制序列有時(shí)不能正好平均地分為6位的塊,在這種情況下,就在序列末尾填充零位,使二進(jìn)制序列的長(zhǎng)度成為24的倍數(shù)(6和8的最小公倍數(shù))。
對(duì)已填充的二進(jìn)制進(jìn)行編碼時(shí),任何完全填充(不包括原始數(shù)組中的位)的6位組都有特殊的第65個(gè)符號(hào)"="表示。如果6位組是部分填充的,就將填充位設(shè)置為0.
下面會(huì)寫一個(gè)填充實(shí)例。初始輸入字符串為"a:a"為3個(gè)字節(jié)(24位)。24是6和8的倍數(shù),因此按照上面給出的例子計(jì)算。無(wú)需填充就會(huì)得到base64編碼為"YTph"。
然而,再增加一個(gè)字符,輸入字符串變?yōu)?a:aa",轉(zhuǎn)換為二進(jìn)制就會(huì)有32位長(zhǎng)。而6和8的下一個(gè)公倍數(shù)為48.因此要添加16為的填充碼。填充的前4位是與數(shù)據(jù)位混合在一起的。得到的6位組01xxxx,會(huì)被當(dāng)作010000、十進(jìn)制中的16,或者base64編碼的Q來(lái)處理。剩下的兩個(gè)6位組都是填充碼,用=來(lái)表示。
a:a -- 011000 010011 101001 100001 -- YTph
a:aa -- 011000 010011 101001 100001 011000 01xxxx xxxxxx xxxxxx -- YTphYQ==
a:aaa -- 011000 010011 101001 100001 011000 010110 0001xx xxxxxx -- YTphYWE=
a:aaaa -- 011000 010011 101001 100001 011000 010110 000101 1000001 -- YTphYWFh
最新的瀏覽器提供了自動(dòng)生成base64的方法atob和btob
btoa("a:a") // => "YTph" atob("YTph") // => "a:a"
希望此文可以幫助你完全理解BASE-64。
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/78801.html
摘要:錢可以存儲(chǔ)在自己的余額中,這就相當(dāng)于微信錢包,余額可以提現(xiàn)到銀行卡的中。我們的第三方支付平臺(tái)是連連支付,杭州的一家公司。私鑰怎么加簽每個(gè)公司的加簽方式是不一樣的,支付寶有支付寶的加簽方式,微信有微信的加簽方式。 導(dǎo)讀 筆者在校期間,通過(guò)自學(xué)java。學(xué)校里也開過(guò)這門課,但是,講的都是一些基礎(chǔ),比如java的表達(dá)式、基本類型、自定義類型等等。也都是很基礎(chǔ)的東西,就連lambda表達(dá)式都沒...
摘要:而的浮點(diǎn)數(shù)設(shè)置的偏移值是,因?yàn)橹笖?shù)域表現(xiàn)為一個(gè)非負(fù)數(shù),位,所以,實(shí)際的,所以。這是因?yàn)樗鼈冊(cè)谵D(zhuǎn)為二進(jìn)制時(shí)要舍入部分的不同可能造成的不同舍 IEEE 754 表示:你盡管抓狂、罵娘,但你能完全避開我,算我輸。 一、IEEE-754浮點(diǎn)數(shù)捅出的那些婁子 首先我們還是來(lái)看幾個(gè)簡(jiǎn)單的問題,能說(shuō)出每一個(gè)問題的細(xì)節(jié)的話就可以跳過(guò)了,而如果只能泛泛說(shuō)一句因?yàn)镮EEE754浮點(diǎn)數(shù)精度問題,那么下文還是...
摘要:結(jié)果是選手獲勝,名為的元素,最終的值為。而合理的命名約定,的確是組織代碼的有效策略。它們會(huì)再由轉(zhuǎn)換為適當(dāng)?shù)慕M合。雖然本文為了嚴(yán)謹(jǐn),結(jié)果寫了相當(dāng)長(zhǎng)的篇幅,但希望你讀過(guò)之后,還能覺得是簡(jiǎn)單易懂的。 不要誤會(huì),CSS Modules可不是在說(shuō)css模塊化這個(gè)好像在某些地方見過(guò)的詞,它其實(shí)是特指一種近期才出現(xiàn)的技術(shù)手段。 什么技術(shù)手段呢?請(qǐng)待后文說(shuō)明。 層疊樣式表 我們知道,css的全名叫做層...
摘要:我們已經(jīng)回答了的構(gòu)造函數(shù)和原型都是誰(shuí)的問題,現(xiàn)在牽扯出來(lái)一個(gè),我們繼續(xù)檢查的構(gòu)造函數(shù)是全局對(duì)象上屬性叫的對(duì)象的原型是個(gè)匿名函數(shù),按照關(guān)于構(gòu)造函數(shù)的約定,它應(yīng)該是構(gòu)造函數(shù)的屬性我們給這個(gè)對(duì)象起個(gè)名字,叫。 我不確定JavaScript語(yǔ)言是否應(yīng)該被稱為Object-Oriented,因?yàn)镺bject Oriented是一組語(yǔ)言特性、編程模式、和設(shè)計(jì)與工程方法的籠統(tǒng)稱謂,沒有一個(gè)詳盡和大家...
摘要:客戶端發(fā)起非登錄請(qǐng)求時(shí),服務(wù)端通過(guò)中的找到對(duì)應(yīng)的來(lái)知道此次請(qǐng)求是誰(shuí)發(fā)出的。數(shù)量隨著登錄用戶的增多而增多,存儲(chǔ)會(huì)增加很多。還記得在上家公司做全干工程師的時(shí)候,基本從頁(yè)面寫到運(yùn)維,當(dāng)時(shí)做登錄這塊的時(shí)候,被session、cookie、token各種概念差點(diǎn)整蒙圈了,上網(wǎng)查詢相關(guān)概念,發(fā)現(xiàn)很多人都是類似的疑惑,比如:showImg(https://user-gold-cdn.xitu.io/201...
閱讀 3277·2021-11-22 14:44
閱讀 1122·2021-11-16 11:53
閱讀 1273·2021-11-12 10:36
閱讀 710·2021-10-14 09:43
閱讀 3703·2019-08-30 15:55
閱讀 3407·2019-08-30 14:14
閱讀 1746·2019-08-26 18:37
閱讀 3420·2019-08-26 12:12