QuincySx簡(jiǎn)書為什么計(jì)算機(jī)是基于二進(jìn)制的最早人們出現(xiàn)了大量計(jì)算的需求,首先經(jīng)歷了人工算然后借助算盤再到步進(jìn)計(jì)算器、差分機(jī)、分析機(jī)。
進(jìn)制轉(zhuǎn)換先說(shuō)一下各個(gè)進(jìn)制的一般的表述方式
大家可以使用以下語(yǔ)句輸出一下看看具體值是多少。 System.out.println(0b101);System.out.println(011);System.out.println(11);System.out.println(0x11);二進(jìn)制與十進(jìn)制十進(jìn)制到二進(jìn)制:20 / 2 = 10 余 010 / 2 = 5 余 05 / 2 = 2 余 12 / 2 = 1 余 01 / 2 = 0 余 1把余數(shù)倒序:10100八進(jìn)制與十進(jìn)制十進(jìn)制到八進(jìn)制:5349 / 8 = 668 余 5668 / 8 = 83 余 483 / 8 = 10 余 310 / 8 = 1 余 21 / 8 = 0 余 1把余數(shù)倒序:12345十六進(jìn)制與十進(jìn)制十進(jìn)制到十六進(jìn)制:74687 / 16 = 4667 余 F(15)4667 / 16 = 291 余 B(11)291 / 16 = 18 余 318 / 16 = 1 余 21 / 16 = 0 余 1把余數(shù)倒序:123BF字符編碼本質(zhì)是根據(jù)標(biāo)準(zhǔn)存儲(chǔ)十進(jìn)制索引編號(hào)。 UTF-8 與 Unicode 的區(qū)別大家看一看阮一峰大神寫的這一篇即可。 Base64 原理首先我們了解一下 Base64 是什么?最初網(wǎng)絡(luò)傳輸有很多特殊字符服務(wù)器無(wú)法識(shí)別,傳輸起來(lái)有些問(wèn)題,所以發(fā)明 Base64 編碼來(lái)進(jìn)行轉(zhuǎn)碼。 Base64 是使用大小寫英文字母各26個(gè)、數(shù)字10個(gè)、加號(hào) Base64 索引表 ![]() 因?yàn)榇颂幬覀兪寝D(zhuǎn)碼文本,所以文本轉(zhuǎn)換二進(jìn)制是通過(guò) Ascll 碼表來(lái)轉(zhuǎn)換的,然后每 6 位轉(zhuǎn)換為十進(jìn)制,然后根據(jù)十進(jìn)制查詢 Base64 索引表查詢相應(yīng)字符進(jìn)行拼接,最后使用 Base64 的原理看到了,我們可以戳破幾個(gè)不正確的說(shuō)法。
byte[] 與 十六進(jìn)制字符串 轉(zhuǎn)換public static byte[] fromHex(String s) { if (s != null) { try { StringBuilder sb = new StringBuilder(s.length()); for (int i = 0; i < s.length(); i++) { char ch = s.charAt(i); // 首先把空格 '\n' '\r' 等特殊字符排除掉 if (!Character.isWhitespace(ch)) { sb.append(ch); } } s = sb.toString(); int len = s.length(); // 原因已經(jīng)解釋過(guò)了 byte 數(shù)組是字符串長(zhǎng)度的 1/2 byte[] data = new byte[len / 2]; for (int i = 0; i < len; i += 2) { // 將 char 轉(zhuǎn)換為 int 當(dāng)做高 4 位 int hi = (Character.digit(s.charAt(i), 16) << 4); // 將 char 轉(zhuǎn)換為 int 當(dāng)做低 4 位 int low = Character.digit(s.charAt(i + 1), 16); if (hi >= 256 || low < 0 || low >= 16) { return null; } // 通過(guò)位運(yùn)算合并 data[i / 2] = (byte) (hi | low); } return data; } catch (Exception ignored) { } } return null; }這個(gè)字符串轉(zhuǎn)換 byte 不好理解我們畫張圖,來(lái)輔助理解下。 ![]() 媒體編碼所有媒體都是一樣的,規(guī)范一個(gè)媒體格式為表述標(biāo)準(zhǔn),然后使用相應(yīng)格式的解析器來(lái)解析。 壓縮壓縮在我們?nèi)粘I钪泻艹R?jiàn),一般都是對(duì)二進(jìn)制數(shù)據(jù)進(jìn)行壓縮,我們今天為了簡(jiǎn)單就用簡(jiǎn)單的字符串舉例來(lái)講明。 無(wú)損壓縮假如文字內(nèi)容是:你好啊你好你好你好你好你好你好你好你好你好你好 簡(jiǎn)單定義一個(gè)壓縮方法,壓縮之后就是:1*你好啊,10*你好 通過(guò)我們自定義的算法解壓縮就可以還原了,一般公司的壓縮算法都是比較復(fù)雜的。 有損壓縮我們現(xiàn)在使用的聲音文件存儲(chǔ)的都是聲音波形。 假設(shè)有個(gè)聲音文件:12 -32 45 23 -54 0 -7 34 37 89 -23 0 -54 有損壓縮就是通過(guò)某些算法把某些無(wú)用的波形刪掉,再執(zhí)行無(wú)損壓縮,但是解碼回來(lái)就會(huì)少一部分聲音。這就是有損壓縮。 至于那些波形是無(wú)用的,是很多科學(xué)家,數(shù)學(xué)家研究得知。 編程語(yǔ)言基本類型(以 Java 為例)
計(jì)算機(jī)中最小的傳遞單位就是 1 字節(jié),一般使用 byte 來(lái)承載。我們?cè)谝话愕拈_(kāi)發(fā)中肯定會(huì)遇到這種在流中讀取數(shù)據(jù)或字節(jié)數(shù)組轉(zhuǎn)換成其他類型或在字節(jié)中讀取相應(yīng)位的數(shù)據(jù)等等業(yè)務(wù)場(chǎng)景,比如網(wǎng)絡(luò)傳輸,藍(lán)牙設(shè)備或物聯(lián)網(wǎng)設(shè)備交互的場(chǎng)景,可能都會(huì)遇到。我舉兩個(gè)高位在前,低位在后的例子,這類操作一般都是使用位運(yùn)算來(lái)實(shí)現(xiàn)。大家在業(yè)務(wù)中遇到其他的場(chǎng)景隨機(jī)應(yīng)變即可。 byte 與 char 的轉(zhuǎn)換(高位在前,低位在后)byte 與 int 的轉(zhuǎn)換(高位在前,低位在后)int i1 = 1234567890; // 二進(jìn)制 01001001 10010110 00000010 11010010byte[] bytes = new byte[4];bytes[0] = (byte) ((i1 >> 24) & 0xFF);bytes[1] = (byte) ((i1 >> 16) & 0xFF);bytes[2] = (byte) ((i1 >> 8) & 0xFF);bytes[3] = (byte) (i1 & 0xFF);int i2 = 0;i2 = i2 | (bytes[0] & 0XFF);i2 = (i2 << 8) | (bytes[1] & 0XFF);i2 = (i2 << 8) | (bytes[2] & 0XFF);i2 = (i2 << 8) | (bytes[3] & 0XFF);取 Int 中的其中幾位在我們一般的物聯(lián)網(wǎng)通信中可能會(huì)在一個(gè) short 值中把操作符和 data 都放進(jìn)去。比如一個(gè) short 是 2 字節(jié)。也就是 16 位,舉個(gè)例子比如前四位表示操作符,中間8位表示數(shù)據(jù),后四位表示校驗(yàn)位。 假設(shè)與設(shè)備通訊中規(guī)定好收到兩個(gè)字節(jié)。 高位,低位假設(shè)有個(gè)二進(jìn)制的值為 1001 0110。 高位是左邊開(kāi)始數(shù),比如高四位就是 1001。 低位是右邊開(kāi)始數(shù),比如低四位就是 0110。 小結(jié)這一篇我講的比較亂,但是魂并沒(méi)有散,講的都是二進(jìn)制層面的一些知識(shí)點(diǎn),也許不是最常用的也不是最全面的,但是如果我這篇博客,你能夠看明白可以受益匪淺。 |
|
|
來(lái)自: 東耳果果 > 《電腦 機(jī)器人 太空 激光》