免费视频淫片aa毛片_日韩高清在线亚洲专区vr_日韩大片免费观看视频播放_亚洲欧美国产精品完整版

打開APP
userphoto
未登錄

開通VIP,暢享免費電子書等14項超值服

開通VIP
計算機的血肉:數(shù)據(jù)

QuincySx

簡書

為什么計算機是基于二進制的

最早人們出現(xiàn)了大量計算的需求,首先經(jīng)歷了人工算然后借助算盤再到步進計算器、差分機、分析機。
計算的需求變得越來越大,機器也越來越先進,首先因為數(shù)學家可以通過邏輯運算進行加減乘除等邏輯運算,然后人們發(fā)明了機械繼電器來描述狀態(tài)表述二進制,由于機械的東西故障率很高又經(jīng)歷了熱電子管(真空管)-> 晶體管、計算機便開始了快速發(fā)展,二進制也成為現(xiàn)代計算機的數(shù)據(jù)承載標準。

自從分析機出現(xiàn)后這些計算工具開始了初步編程化,然后出現(xiàn)了打孔機。直到出現(xiàn)馮·諾依曼結(jié)構(gòu),計算機開始蓬勃發(fā)展。

進制轉(zhuǎn)換

先說一下各個進制的一般的表述方式

進制名稱Java 中寫法一般表示符號
二進制0b101 0b 開頭是二進制BIN
八進制011 0 開頭是八進制OCT
十進制11 正常數(shù)字寫法就是十進制DEC
十六進制0x11 0x 開頭是十六進制HEX

大家可以使用以下語句輸出一下看看具體值是多少。

System.out.println(0b101);System.out.println(011);System.out.println(11);System.out.println(0x11);

二進制與十進制

二進制到十進制:10100 = 1 * 2^4 + 0 * 2^3 + 1 * 2^2 + 0 * 2^1 + 0 * 2^0 = 20
十進制到二進制:20 / 2 = 10 余 010 / 2 = 5 余 05 / 2 = 2 余 12 / 2 = 1 余 01 / 2 = 0 余 1把余數(shù)倒序:10100

八進制與十進制

八進制到十進制:12345 = 1 * 8^4 + 2 * 8^3 + 3 * 8^2 + 4 * 8^1 + 5 * 8^0 = 5349
十進制到八進制:5349 / 8 = 668 余 5668 / 8 = 83 余 483 / 8 = 10 余 310 / 8 = 1 余 21 / 8 = 0 余 1把余數(shù)倒序:12345

十六進制與十進制

十六進制到十進制:123BF = 1 * 16^4 + 2 * 16^3 + 3 * 16^2 + B(11) * 16^1 + F(15) * 16^0 = 74687
十進制到十六進制:74687 / 16 = 4667 余 F(15)4667 / 16 = 291 余 B(11)291 / 16 = 18 余 318 / 16 = 1 余 21 / 16 = 0 余 1把余數(shù)倒序:123BF

字符編碼

本質(zhì)是根據(jù)標準存儲十進制索引編號。
哈夫曼最小字符編碼(五位 32個值)-> Ascll 編碼(7位 128個值) -> Unicode 編碼(16位)

UTF-8 與 Unicode 的區(qū)別

大家看一看阮一峰大神寫的這一篇即可。

字符編碼筆記:ASCII,Unicode 和 UTF-8

Base64 原理

首先我們了解一下 Base64 是什么?最初網(wǎng)絡傳輸有很多特殊字符服務器無法識別,傳輸起來有些問題,所以發(fā)明 Base64 編碼來進行轉(zhuǎn)碼。

Base64 是使用大小寫英文字母各26個、數(shù)字10個、加號 + 和斜杠 / 64 個字符來表示數(shù)據(jù)的編碼,除了有以上 64 個符號,還有一個 = 作為后綴。因為只有 64 個有效字符,所以二進制有效位也只有 6 位(00111111 可以表示 64 個數(shù))。

Base64 索引表

因為此處我們是轉(zhuǎn)碼文本,所以文本轉(zhuǎn)換二進制是通過 Ascll 碼表來轉(zhuǎn)換的,然后每 6 位轉(zhuǎn)換為十進制,然后根據(jù)十進制查詢 Base64 索引表查詢相應字符進行拼接,最后使用 = 代表 6 位去補齊,使位的總長度為 8 的倍數(shù)。解碼亦如此。

Base64 的原理看到了,我們可以戳破幾個不正確的說法。

  1. Base64 加密算法,我們看到了這根本不是什么加密算法,只是編碼算法而已,最多使內(nèi)容不能讓人一眼就能記住。
  2. Base64 壓縮,壓縮也是不對的方法,根據(jù)他的實現(xiàn)方式,我們基本可以算出經(jīng)過 Base64 編碼會使數(shù)據(jù)增大 1/3。如果是對 Base64 編碼后的數(shù)據(jù)在進行壓縮,那就是其他壓縮方式了,就不屬于 Base64 編碼的范疇了。

byte[] 與 十六進制字符串 轉(zhuǎn)換

public static String toHex(byte[] bytes) {    if (bytes == null) {        return '';    }    final char[] hexArray = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f'};    // byte 最大值是 255 轉(zhuǎn)成字符串則為 0xFF,所以字符串長度是 byte 數(shù)組的兩倍。    char[] hexChars = new char[bytes.length * 2];    int v;    for (int j = 0; j < bytes.length; j++) {        v = bytes[j] & 0xFF; // 取 8 個位        hexChars[j * 2] = hexArray[v >>> 4]; // 取高 4 位放入 char        hexChars[j * 2 + 1] = hexArray[v & 0x0F]; // 取低 4 位放入 char    }    return new String(hexChars); // 轉(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)解釋過了 byte 數(shù)組是字符串長度的 1/2 byte[] data = new byte[len / 2]; for (int i = 0; i < len; i += 2) { // 將 char 轉(zhuǎn)換為 int 當做高 4 位 int hi = (Character.digit(s.charAt(i), 16) << 4); // 將 char 轉(zhuǎn)換為 int 當做低 4 位 int low = Character.digit(s.charAt(i + 1), 16); if (hi >= 256 || low < 0 || low >= 16) { return null; } // 通過位運算合并 data[i / 2] = (byte) (hi | low); } return data; } catch (Exception ignored) { } } return null; }

這個字符串轉(zhuǎn)換 byte 不好理解我們畫張圖,來輔助理解下。

媒體編碼

所有媒體都是一樣的,規(guī)范一個媒體格式為表述標準,然后使用相應格式的解析器來解析。

壓縮

壓縮在我們?nèi)粘I钪泻艹R姡话愣际菍ΧM制數(shù)據(jù)進行壓縮,我們今天為了簡單就用簡單的字符串舉例來講明。

無損壓縮

假如文字內(nèi)容是:你好啊你好你好你好你好你好你好你好你好你好你好

簡單定義一個壓縮方法,壓縮之后就是:1*你好啊,10*你好

通過我們自定義的算法解壓縮就可以還原了,一般公司的壓縮算法都是比較復雜的。

有損壓縮

我們現(xiàn)在使用的聲音文件存儲的都是聲音波形。

假設(shè)有個聲音文件:12 -32 45 23 -54 0 -7 34 37 89 -23 0 -54

有損壓縮就是通過某些算法把某些無用的波形刪掉,再執(zhí)行無損壓縮,但是解碼回來就會少一部分聲音。這就是有損壓縮。

至于那些波形是無用的,是很多科學家,數(shù)學家研究得知。

編程語言基本類型(以 Java 為例)

類型字節(jié)
boolean18
byte18
char216
short216
int432
long864
float432
double864

計算機中最小的傳遞單位就是 1 字節(jié),一般使用 byte 來承載。我們在一般的開發(fā)中肯定會遇到這種在流中讀取數(shù)據(jù)或字節(jié)數(shù)組轉(zhuǎn)換成其他類型或在字節(jié)中讀取相應位的數(shù)據(jù)等等業(yè)務場景,比如網(wǎng)絡傳輸,藍牙設(shè)備或物聯(lián)網(wǎng)設(shè)備交互的場景,可能都會遇到。我舉兩個高位在前,低位在后的例子,這類操作一般都是使用位運算來實現(xiàn)。大家在業(yè)務中遇到其他的場景隨機應變即可。

byte 與 char 的轉(zhuǎn)換(高位在前,低位在后)

char c1 = '中'; // 二進制 0100111000101101 UTF-8 編碼為 ’中'byte[] bytes = new byte[2];bytes[0] = (byte) ((c1 >> 8) & 0xff); // 01001110bytes[1] = (byte) (c1 & 0xff); // 00101101char c2 = '國'; // 二進制 0100111000101101 UTF-8 編碼為 '國'// 第一步先把 c2 的值清空,兩種方式// 1. 左移 16 位將 c2 清零c2 = (char) (c2 << 16);// 2. 無符號右移 16 位將 c2 清零c2 = (char) (c2 >>> 16);c2 = (char) (c2 | (bytes[0] & 0XFF)); // 將低八位賦值c2 = (char) ((c2 << 8) | (bytes[1] & 0XFF)); // 左移八位,繼續(xù)將低八位賦值// c2 的值被改為 ’中'

byte 與 int 的轉(zhuǎn)換(高位在前,低位在后)

int i1 = 1234567890; // 二進制 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)通信中可能會在一個 short 值中把操作符和 data 都放進去。比如一個 short 是 2 字節(jié)。也就是 16 位,舉個例子比如前四位表示操作符,中間8位表示數(shù)據(jù),后四位表示校驗位。

假設(shè)與設(shè)備通訊中規(guī)定好收到兩個字節(jié)。

// byte[] 轉(zhuǎn)換成 shortshort data = 0;data = (short) (data | (bytes[0] & 0XFF));data = (short) ((data << 8) | (bytes[1] & 0XFF)); //假設(shè) data 十進制的值為 31766 ,二進制為 01111100 00010110// 取得前四位操作符 operator 為 28672 二進制 0111 0000 0000 0000short operator = (short) (data & 0xF000); // 0xF000:11110000 00000000// 取得中間八位數(shù)據(jù) data1 為 3088 二進制 0000 1100 0001 0000short data1 = (short) (data & 0x0FF0); // 0x0FF0:00001111 11110000// 取得后四位校驗位 check 為 6 二進制 0000 0000 0000 0110short check = (short) (data & 0x000F); // 0x000F:00000000 00001111

高位,低位

假設(shè)有個二進制的值為 1001 0110。

高位是左邊開始數(shù),比如高四位就是 1001。

低位是右邊開始數(shù),比如低四位就是 0110。

小結(jié)

這一篇我講的比較亂,但是魂并沒有散,講的都是二進制層面的一些知識點,也許不是最常用的也不是最全面的,但是如果我這篇博客,你能夠看明白可以受益匪淺。

本站僅提供存儲服務,所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊舉報。
打開APP,閱讀全文并永久保存 查看更多類似文章
猜你喜歡
類似文章
對于Python中的字節(jié)串bytes和字符串以及轉(zhuǎn)義字符的新的認識
密碼學基礎(chǔ)之進制與編碼
Java中二進制、十進制、十六進制及ASCII碼與String及字節(jié)數(shù)組與十六進制之間的轉(zhuǎn)換
BCD碼、十六進制與十進制互轉(zhuǎn)
Base-x 編碼的奧秘
Qt小案例——進制轉(zhuǎn)換
更多類似文章 >>
生活服務
分享 收藏 導長圖 關(guān)注 下載文章
綁定賬號成功
后續(xù)可登錄賬號暢享VIP特權(quán)!
如果VIP功能使用有故障,
可點擊這里聯(lián)系客服!

聯(lián)系客服