前端Base64编码知识,一文打尽

article/2025/9/11 4:51:12

原文: https://juejin.cn/post/6989391487200919566 

作者: 云的世界 

掘金专栏: 前端基础进阶

 大厂技术  高级前端  Node进阶

点击上方 程序员成长指北,关注公众号

回复1,加入高级Node交流群

前言

本文将详细的介绍前端 Base64 编码知识,探索起源,让大家对开发经常用到的 Base64 有个更全面深入的认知。

大纲

  • Base64在前端的应用

  • Base64数据编码起源

  • Base64编码64的含义

  • Base64编码优缺点

  • 一些计算机和前端基础知识

  • ASCII码, Unicode , UTF-8

  • Base64编码和解码

  • 其他的成熟方案

Base64在前端的应用

Base64编码,你一定知道的,先来看看它在前端的一些常见应用:
当然绝部分场景都是基于Data URLs[1]

Canvas图片生成

canvas的 toDataURL[2]可以把canvas的画布内容转base64编码格式包含图片展示的 data URI[3]。

const ctx = canvasEl.getContext("2d");
// ...... other code
const dataUrl = canvasEl.toDataURL();// data:image/png;base64,iVBORw0KGgoAAAANSUhE.........

你画我猜,新用户加入,要获取当前的最新的绘画界面,也可以通过Base64格式的消息传递。

文件读取

FileReader的 readAsDataURL[4]可以把上传的文件转为base64格式的data URI,比较常见的场景是用户头像的剪裁和上传。

function readAsDataURL() {const fileEl = document.getElementById("inputFile");return new Promise((resolve, reject) => {const fd = new FileReader();fd.readAsDataURL(fileEl.files[0]);fd.onload = function () {resolve(fd.result);// data:image/png;base64,iVBORw0KGgoAAAA.......}fd.onerror = reject;});
}

jwt

jwt由header, payload,signature三部分组成,前两个解码后,都是可以明文看见的。拿 国服最强JWT生成Token做登录校验讲解,看完保证你学会![5] 里面的token做测试。

image.png

网站图片和小图片

移动端网站图标优化

<link rel="icon" href="data:," />
<link rel="icon" href="data:;base64,=" />

至于怎么获得这个值data:,的:

<canvas height="0" width="0" id="canvas"></canvas>
<script>const canvasEl = document.getElementById("canvas");const ctx = canvasEl.getContext("2d");dataUrl = canvasEl.toDataURL();console.log(dataUrl);  // data:,
</script>

小图片

这个就有很多场景了,比如img标签,背景图等

img标签:

<img src="data:image/png;base64,iVBORw0KGgoAAAA......." />

css背景图:

.bg{background: url(data:image/png;base64,iVBORw0KGgoAAAA.......)
}

简单的数据加密

当然这不是好方法,但是至少让你不好解读。

const username = document.getElementById("username").vlaue; const password = document.getElementById("password").vlaue;  const secureKey = "%%S%$%DS)_sdsdj_66";const sPass = utf8_to_base64(password + secureKey);doLogin({username,password: sPass})

SourceMap

借用阮大神的一段代码, 注意mappings字段,这实际上就是bas64编码格式的内容,当然你直接去解,是会失败的。

{version : 3,file: "out.js",sourceRoot : "",sources: ["foo.js", "bar.js"],names: ["src", "maps", "are", "fun"],mappings: "AAgBC,SAAQ,CAAEA"}

具体的实现请看官方的base64-vlq.js[6]文件。

混淆加密代码

著名的代码混淆库, javascript-obfuscator[7],其也是有应用base64几码的,一起看看选项:
webpack-obfuscator[8]也是基于其封装的。

    --string-array-indexes-type '<list>' (comma separated) [hexadecimal-number, hexadecimal-numeric-string]--string-array-encoding '<list>' (comma separated) [none, base64, rc4]--string-array-index-shift <boolean>--string-array-wrappers-count <number>--string-array-wrappers-chained-calls <boolean>
image.png

其他

X.509公钥证书, github SSH key, mht文件,邮件附件等等,都有Base64的影子。

Base64数据编码起源

早期邮件传输协议基于 ASCII 文本,对于诸如图片、视频等二进制文件处理并不好。ASCII 主要用于显示现代英文,到目前为止只定义了 128 个字符,包含控制字符和可显示字符。为了解决上述问题,Base64 编码顺势而生。

Base64是编解码,主要的作用不在于安全性,而在于让内容能在各个网关间无错的传输,这才是Base64编码的核心作用。

除了Base64数据编码,其实还有Base32数据编码, Base16数据编码,可以参见 RFC 4648[9]

Base64编码64的含义

64就是64个字符的意思。

base64对照表, 借用 Base64原理[10]的一张图:

  1. A-Z 26

  2. a-z 26

  3. 0-9 10

  4. + / 2

26 + 26 + 10 + 2 = 64

当然还有一个字符=,这是填充字符,后面会提到,不属于64里面的范畴。

对照表的索引值,注意一下,后面的base64编码和解码会用到。

Base64编码优缺点

优点

  1. 可以将二进制数据(比如图片)转化为可打印字符,方便传输数据

  2. 对数据进行简单的加密,肉眼是安全的

  3. 如果是在html或者css处理图片,可以减少http请求

缺点

  1. 内容编码后体积变大, 至少1/3
    因为是三字节变成四个字节,当只有一个字节的时候,也至少会变成三个字节。

  2. 编码和解码需要额外工作量


说完优缺点,回到正题:

我们今天的重点是 uf8编码转Base64编码:

基本流程

char => 码点 => utf-8编码 => base64编码

在之前要解一下编码的知识, 了解编码知识,又要先了解一些计算机的基础知识。

一些计算机和前端基础知识

比特和字节

比特又叫位。在计算机的世界里,信息的表示方式只有 0 和 1, 其可以表示两种状态。
一位二进制可以表示两状态, N位可以表示2^N种状态。

一个字节(Byte)有8位(Bit)

所以一个字节可以表示 2^8 = 256种状态;

获得字符的 Unicode码点

String.prototype.charCodeAt[11] 可以获取字符的码点,获取范围为0 ~ 65535。这个地方注意一下,关系到后面的utf-8字节数。

"a".charCodeAt(0)  // 97
"中".charCodeAt(0) // 20013

进制表示

  1. 0b开头,可以表示二进制

注意0b10000000= 128 ,0b11000000=92,之后会用到.

0b11111111 // 255
0b10000000 // 128 后面会用到
0b11000000 // 192 后面会用到
image.png
  1. 0x开头,可以表示16进制

0x11111111 // 286331153
image.png

0o开头可以表示8进制,就不多说了,本来不会涉及。

进制转换

10进制转其他进制
Number.prototype.toString(radix)[12]可以把十进制转为其他进制。

100..toString(2)  // 1100100
100..toString(16) // 64, 也等于 ox64

其他进制转为10进制
parseInt(string, radix)[13]可以把其他进制,转为10进制。

parseInt("10000000", 2) // 128
parseInt("10",16) // 16

这里额外提一下一元操作符号+可以把字符串转为数字,后面也会用到,之前提到的0b,0o,0x这里都会生效。

+"1000" // 1000
+"0b10000000" // 128
+"0o10" // 8
+"0x10" // 16

位移操作

本文只涉及右移操作,就只讲右移,右移相当于除以2,如果是整数,简单说是去低位,移动几位去掉几位,其实和10进制除以10是一样的。

64 >> 2 = 16 我们一起看一下过程

0 1 0 0 0 0 0 0       64
-------------------0 1 0 0 0 0 | 0 0  16

一元 & 操作和 一元|操作

一元&

当两者皆为1的时候,值为1。 本文的作用可用来去高位, 具体看代码。
3553 & 36 = 0b110111100001 & 0b111111 = 100001
因为高位缺失,不可能都为1,故均为0, 而低位相当于复制一遍而已

110111 100001111111
------------
000000 100001

一元|
当任意一个为1,就输出为1. 本文用来填补0。比如,把3补成8位二进制
3 | 256 = 11 | 100000000 = 100000011

100000011.substring(1)是不是就等于8位二进制呢00000011

具备了这些基本知识,我们就开始先了解编码相关的知识。

ASCII码, Unicode , UTF-8

ASCII码

ASCII码第一位始终是0, 那么实际可以表示的状态是 2^7 = 128种状态。

ASCII 主要用于显示现代英文,到目前为止只定义了 128 个字符,包含控制字符和可显示字符。

  • 0~31 之间的ASCII码常用于控制像打印机一样的外围设备

  • 32~127 之间的ASCII码表示的符号,在我们的键盘上都可以被找到

完整的 ASCII码对应表,可以参见 基本ASCII码和扩展ASCII码[14]

接下来是Unicode和UTF-8编码,请先记住这个重要的知识:

  • Unicode: 字符集

  • UTF-8: 编码规则

Unicode

Unicode 为世界上所有字符都分配了一个唯一的编号(码点),这个编号范围从 0x000000 到 0x10FFFF (十六进制),有 100 多万,每个字符都有一个唯一的 Unicode 编号,这个编号一般写成 16 进制,在前面加上 U+。例如:的 Unicode 是U+6398。

  • U+0000到U+FFFF

最前面的65536个字符位,它的码点范围是从0一直到216-1。所有最常见的字符都放在这里。

  • U+010000一直到U+10FFFF

剩下的字符都放着这里,码点范围从U+010000一直到U+10FFFF。

Unicode有平面的概念,这里就不拓展了。

Unicode只规定了每个字符的码点,到底用什么样的字节序表示这个码点,就涉及到编码方法。

UTF-8

UTF-8 是互联网使用最多的一种 Unicode 的实现方式。还有 UTF-16(字符用两个字节或四个字节表示)和 UTF-32(字符用四个字节表示)等实现方式。

UTF-8 是它是一种变长的编码方式, 使用的字节个数从 1 到 4 个不等,最新的应该不止4个, 这个1-4不等,是后面编码和解码的关键。

UTF-8的编码规则:

  1. 对于只有一个字节的符号,字节的第一位设为0,后面 7 位为这个符号的 Unicode 码。此时,对于英语字母UTF-8 编码和 ASCII 码是相同的。

  2. 对于 n 字节的符号(n > 1),第一个字节的前 n 位都设为 1,第 n + 1 位设为0,后面字节的前两位一律设为 10。剩下的没有提及的二进制位,全部为这个符号的 Unicode 码,如下表所示:

Unicode 码点范围(十六进制)十进制范围UTF-8 编码方式(二进制)字节数
0000 0000 ~ 0000 007F0 ~ 1270xxxxxxx1
0000 0080 ~ 0000 07FF128 ~ 2047110xxxxx 10xxxxxx2
0000 0800 ~ 0000 FFFF2048 ~ 655351110xxxx 10xxxxxx 10xxxxxx3
0001 0000 ~ 0010 FFFF65536 ~ 111411111110xxx 10xxxxxx 10xxxxxx 10xxxxxx4

我们可能没见过字节数为2或者为4的字符, 字节数为2的可以去Unicode对应表[15]这里找,而等于4的可以去这看看Unicode® 13.0 Versioned Charts Index[16]

下面这些码点都处于0000 0080 ~ 0000 07FF, utf-8编码需要2个字节

下面这些码点都处于0001 0000 ~ 0010 FFFF, utf-8编码需要4个字节

可能这里光说不好理解,我们分别以英文字符a和中文字符来讲解一下:

为了验证结果,可以去 Convert UTF8 to Binary Bits - Online UTF8 Tools[17]

英文字符a

  1. 先获得其码点,"a".charCodeAt(0) 等于 97

  2. 对照表格, 0~127, 需1个字节

  3. 97..toString(2) 得到编码 1100001

  4. 根据格式0xxxxxxx进行填充, 最终结果

01100001

中文字符

  1. 先获得其码点,"掘".charCodeAt(0) 等于 25496

  2. 对照表格,2048 ~ 65535 需3个字节

  3. 25496..toString(2) 得到编码 110 001110 011000

  4. 根绝格式1110xxxx 10xxxxxx 10xxxxxx进行填充, 最终结果如下

11100110 10001110 10011000

Convert UTF8 to Binary Bits - Online UTF8 Tools[18]执行结果:完全匹配

image.png

抽象把字符转为utf8格式二进制的方法

基于上面的表格和转换过程,我们抽象一个方法,这个方法在之后的Base64编码和解码至关重要

先看看功能,覆盖utf8编码1-3字节范围

console.log(to_binary("A"))  // 11100001
console.log(to_binary("س"))  // 1101100010110011
console.log(to_binary("掘")) // 111001101000111010011000

方法如下

function to_binary(str) {const string = str.replace(/\r\n/g, "\n");let result = "";let code;for (var n = 0; n < string.length; n++) {//获取麻点code = str.charCodeAt(n);if (code < 0x007F) { // 1个字节// 0000 0000 ~ 0000 007F  0 ~ 127 1个字节// (code | 0b100000000).toString(2).slice(1)result += (code).toString(2).padStart(8, '0'); } else if ((code > 0x0080) && (code < 0x07FF)) {// 0000 0080 ~ 0000 07FF 128 ~ 2047 2个字节// 0x0080 的二进制为 10000000 ,8位,所以大于0x0080的,至少有8位// 格式 110xxxxx 10xxxxxx     // 高位 110xxxxxresult += ((code >> 6) | 0b11000000).toString(2);// 低位 10xxxxxxresult += ((code & 0b111111) | 0b10000000).toString(2);} else if (code > 0x0800 && code < 0xFFFF) {// 0000 0800 ~ 0000 FFFF 2048 ~ 65535 3个字节// 0x0800的二进制为 1000 00000000,12位,所以大于0x0800的,至少有12位// 格式 1110xxxx 10xxxxxx 10xxxxxx// 最高位 1110xxxxresult += ((code >> 12) | 0b11100000).toString(2);  // 第二位 10xxxxxxresult += (((code >> 6) & 0b111111) | 0b10000000).toString(2);// 第三位 10xxxxxxresult += ((code & 0b111111) | 0b10000000).toString(2);} else {// 0001 0000 ~ 0010 FFFF   65536 ~ 1114111   4个字节 // https://www.unicode.org/charts/PDF/Unicode-13.0/U130-2F800.pdfthrow new TypeError("暂不支持码点大于65535的字符")}}return result;
}

方法中有三个地方稍微难理解一点,我们一起来解读一下:

  1. 二字节 (code >> 6) | 0b11000000

其作用是生成高位二进制。
我们以实际的一个栗子来讲解,以س为例,其码点为0x633,在0000 0080 ~ 0000 07FF之间,占两个字节, 在其二进制编码为11 000110011 , 其填充格式如下, 低位要用6位

110xxxxx 10xxxxxx

为了方便观察,我们把 11 000110011 重新调整一下 11000 110011

(code >> 6) 等于 00110011 >> 6,右移6位, 直接干掉低6位。为什么是6呢,因为低位需要6位,右移动6位后,剩下的就是用于高位操作的位了。

1100000011000 | 110011 
--------------
11011000      
  1. 二字节 (code & 0b111111) | 0b10000000
    作用,用于生成低位二进制。以س为例,11000 110011, 填充格式

  110xxxxx 10xxxxxx

(code & 0b111111)这步的操作是为了干掉6位以上的高位,仅仅保留低6位。一元&符号,两边都是1的时候才会是1,妙啊。

11000 110011111111
------------------110011  

接着进行 | 0b10000000, 主要是按照格式10xxxxxx进行位数填补, 让其满8位。

 11000 110011111111         (code & 0b111111)------------------110011  10 000000         (code & 0b111111) | 0b10000000
-------------------10 110011

Base64编码和解码

utf-8转Base64编码规则

  1. 获取每个字符的Unicode码,转为utf-8编码

  2. 三个字节作为一组,一共是24个二进制位
    字节数不能被 3 整除,用0字节值在末尾补足

  3. 按照6个比特位一组分组,前两位补0,凑齐8位

  4. 计算每个分组的数值

  5. 以第4步的值作为索引,去ASCII码表找对应的值

  6. 替换第2添加字节数个数的 =
    比如第2添加了2个字节,后面是2个=

以大掘A为例, 我们通过上面的utf8_to_binary方法得到utf8的编码
11100110 10001110 10011000 11000001, 其字节数不能被3整除,后面填补

11100110
10001110
10011000
01000001
--------
00000000
00000000

6位一组分为四组, 高位补0, 用| 分割一下填补的。

00 | 111001  => 57 => 5
00 | 101000  => 40 => o
00 | 111010  => 58 => 6
00 | 011000  => 24 => Y00 | 110000  => 16 => Q
00 | 010000  => 16 => Q
00 | 000000  =>    => =
00 | 000000  =>    => =

结果是:5o6YQQ==, 完美。

utf-8转Base64编码规则代码实现

基于上面的to_binary方法和base64的转换规则,就很简单啦:
先看看执行效果,very good, 和 base64.us[19] 结果完全一致。

console.log(utf8_to_base64("a")); // YQ==console.log(utf8_to_base64("Ȃ"));  // yII=console.log(utf8_to_base64("中国人")); // 5Lit5Zu95Lq6console.log(utf8_to_base64("Coding Writing 好文召集令|后端、大前端双赛道投稿,2万元奖池等你挑战!"));
//Q29kaW5nIFdyaXRpbmcg5aW95paH5Y+s6ZuG5Luk772c5ZCO56uv44CB5aSn5YmN56uv5Y+M6LWb6YGT5oqV56i/77yMMuS4h+WFg+WlluaxoOetieS9oOaMkeaImO+8gQ==

完整代码如下:


const BASE64_CHARTS = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'
function utf8_to_base64(str: string) {let binaryStr = to_binary(str);const len = binaryStr.length;// 需要填补的=的数量let paddingCharLen = len % 24 !== 0 ? (24 - len % 24) / 8 : 0;//6个一组const groups = [];for (let i = 0; i < binaryStr.length; i += 6) {let g = binaryStr.slice(i, i + 6);if (g.length < 6) {g = g.padEnd(6, "0");}groups.push(g);}// 求值let base64Str = groups.reduce((b64str, cur) => {b64str += BASE64_CHARTS[+`0b${cur}`]return b64str}, "");// 填充=if (paddingCharLen > 0) {base64Str += paddingCharLen > 1 ? "==" : "=";}return base64Str;
}

至于解码,是其逆过程,留给大家去实现吧。

其他的成熟方案

  1. 当然是基于已有的 btoaatob,

但是 unescape是不被推荐使用的方法

function utf8_to_b64( str ) {return window.btoa(unescape(encodeURIComponent( str )));
}function b64_to_utf8( str ) {return decodeURIComponent(escape(window.atob( str )));
}

// Usage: utf8_to_b64('✓ à la mode'); // "4pyTIMOgIGxhIG1vZGU=" b64_to_utf8('4pyTIMOgIGxhIG1vZGU='); // "✓ à la mode"

  1. MDN的 rewriting `atob()` and `btoa()` using `TypedArray`s and UTF-8[20]

其支持到6字节,但是可读性并不好。

  1. 第三方库 base64-js[21] 与 js-base64[22]都是周下载量过百万的库。

虽然有那么多成熟的,但是我们理解和自己实现,才能更明白Base64的编码原理。

额外补充一点

  1. 编码关系图

借用[你真的了解 Unicode 和 UTF-8 吗?[23]]一张图:

image.png
  1. DOMString[24] 是utf-16编码

引用

Version-Specific Charts[25]
Unicode13.0.0[26]
Unicode® 13.0 Versioned Charts Index[27]
RFC 4648 | The Base16, Base32, and Base64 Data Encodings[28]
Base64 encoding and decoding[29]
字符编码笔记:ASCII,Unicode 和 UTF-8[30]
Unicode与JavaScript详解[31]
Base64 编码入门教程[32] Base64原理[33]
详解base64原理[34]
一文读懂base64编码[35]
JS 中关于 base64 的一些事[36]
Base64 的原理、实现及应用[37]
图片与Base64换算关系[38]
[你真的了解 Unicode 和 UTF-8 吗?[39]]
Unicode中UTF-8与UTF-16编码详解[40]
Unicode对应表[41]
JavaScript Source Map 详解[42]

Node 社群

我组建了一个氛围特别好的 Node.js 社群,里面有很多 Node.js小伙伴,如果你对Node.js学习感兴趣的话(后续有计划也可以),我们可以一起进行Node.js相关的交流、学习、共建。下方加 考拉 好友回复「Node」即可。

   “分享、点赞、在看” 支持一波 


http://chatgpt.dhexx.cn/article/qZHtpXgq.shtml

相关文章

Python模板库Mako的语法

原文链接&#xff1a;http://www.yeolar.com/note/2012/08/28/mako-syntax/ Mako模板从一个包含各种类型的内容的文本流解析得到&#xff0c;包括XML、HTML、email文本等。模板还可以包含Mako指令&#xff0c;用来表示变量和表达式替换、控制结构、服务器端注释、整块Python代码…

Django mako 的使用(七)

Django mako 的使用 6.6 mako 的使用 6.6 mako 的使用 安装 mako pip install mako 创建子应用 makos python .\manage.py startapp makos 创建 base_render.py 文件 from django.http import HttpResponse from django.template import RequestContext from django.templat…

mako模版库实践

介绍 这几天在编写一个数据驱动测试框架&#xff0c;其中一个核心模块是根据数据输入&#xff0c;自动转换为测试用例代码。测试数据格式固定&#xff0c;对应的用例代码结构也相对稳定。基于此场景&#xff0c;联想到web页面根据数据从template渲染页面&#xff0c;决定使用类…

Django——mako的配置与使用方法

一、前言 mako最大的特点就是允许在HTML中随意书写Python代码&#xff0c;挺起就很心动啊&#xff01;&#xff01; 二、准备阶段 新建一个项目mako_project&#xff0c;再新建一个app叫app&#xff0c;然后安装mako&#xff08;要联网安装&#xff09; pip install mako然…

Xen新特性

4.0 为了增强主机层面的性能和可扩展性&#xff0c;新的Xen 4.0虚拟机管理程序现在横跨主机服务器上的128(之前64 )个物理处理器&#xff0c;最多可以处理1TB的物理主系统内存。在访客环境中&#xff0c;基于Xen 4.0运行的虚拟机现在可以分配给多达128个虚拟处理器/VCPU(不过…

Xen - Networking

Xen - Networking Step 0 : Xen底下的網路架構 Step 1 : 虛擬還是實體 Step 2 : network-bridge Step 3 : network-nat Step 4 : network-route Step 5 : 參考網頁 Step 0 : Xen底下的網路架構 在虛擬化下的環境就屬網路裝置最為複雜難懂,不過模式大致可以畫分成 3 種 1.netw…

Xen虚拟化之一:Xen环境组件详解

Xen是一个开放源代码虚拟机监视器(Virtual Machine Monitor&#xff0c;简称为VMM)&#xff0c;由剑桥大学开发&#xff0c;它致力于实现在单个计算机上运行多达128个有完全功能的操作系统。Xen通过一种叫做半虚拟化(paravirtualization)的技术获得高效能的表现&#xff08;较少…

浅谈Xen和半虚拟化技术

研究生入学的时候&#xff0c;看了一篇论文——《Xen and the art of virtualization》。现在时隔一年&#xff0c;准备对此进行一番整理。下文是我Xen为例的半虚拟化技术的理解&#xff1a; 虚拟机概况 首先从虚拟机说起&#xff0c;虚拟机技术最早由IBM于上世纪六七十年代提…

xen架构

Xen是一个虚拟机监视器&#xff08;Virtual machine monitor&#xff09;&#xff0c;针对X86系列计算机设计&#xff0c;它能够支持多个客户计算机的同时运行&#xff0c;并且能够达到较好的一个性能水平和资源隔离。Xen是一个开放源代码软件&#xff0c;在GNU General Public…

Xen概述

http://my.oschina.net/davehe/blog/94039 1 Xen概述 1.1 简介 Xen是由剑桥大学计算机实验室开发的一个开源项目。是一个直接运行在计算机硬件之上的用以替代操作系统的软件层&#xff0c;它能够在计算机硬件上并发的运行多个客户操作系统&#xff08;Guest OS&#xff…

KVM和Xen虚拟化有什么区别?Xen和KVM优缺点对比

KVM和Xen是两大虚拟化技术&#xff0c;KVM和Xen又是免费开源的管理程序&#xff0c;新手站长网分享虚拟化技术KVM和Xen的区别优势对比&#xff1a; KVM和Xen的区别 KVM&#xff1a;KVM是轻量级的虚拟化管理程序模块&#xff0c;该模块主要来自Linux内核&#xff1b;KVM的虚拟…

Xen与XenServer的区别

说到XenServer&#xff0c;总是离不开Xen&#xff0c;所以我要说他们的区别&#xff0c;得首先从Xen开始说起&#xff01; Xen体系架构 Xen hypervisor体系架构 Xen 的 VMM ( Xen Hypervisor ) 位于操作系统和硬件之间&#xff0c;负责为上层运行的操作系统内核提供虚拟化的硬件…

xen的安装

一、 Xen介绍 : 在虚拟化软件的部份&#xff0c;可分为VMWare、Xen、KVM、VritualBox是较为常见的。在Xen这到自由软件上主要可分为半虚拟化(Para-virtualization) 及全虚拟化 (Full virtualization) 两种&#xff0c;其中半虚拟化主要是透过修改 Linux 核心来达成的虚拟技术。…

虚拟机体验之 Xen 篇 —— 令人脑洞大开的奇异架构

转载于https://www.cnblogs.com/youxia/p/linux022.html#_label0 阅读目录 总结&#xff1a; 这一篇我要体验的虚拟机系统是 Xen。在虚拟机领域&#xff0c;Xen 具有非常高的知名度&#xff0c;其名字经常在各类文章中出现。同时 Xen 也具有非常高的难度&#xff0c;别说玩转…

xen基础

xen结构概述 一个 Xen 虚拟化环境包括一组项目&#xff0c;它们一起工作来提供虚拟化环境&#xff1a;Xen hypervisor&#xff1b;dom0&#xff1b;domain management and control&#xff0c;域的管理和控制&#xff1b;domU PV 客户机&#xff1b;domU HVM 客户机。 它们之间…

Xen 简介

---------------------------------同样来自 IBM ------------------------------------ Xen 是一种类型 1 虚拟机管理程序&#xff0c;它创建系统资源的逻辑池&#xff0c;使许多虚拟机可共享相同的物理资源。 Xen 是一个直接在系统硬件上运行的虚拟机管理程序。Xen 在系统硬…

全面详解Python与Ruby,到底哪款更优秀

今天,我和大家讨论一下是Python开发语言web好还是Ruby开发语言web好,有需要的小伙伴,可以参考一下。对这方面有自己见解的大神,可以交流一下。希望大家可以认真阅读哦! Python 和 Ruby 都是目前用来开发 websites、web-based apps 和 web services 的流行编程语言之一。 …

Ruby入门级示例代码

【实例简介】 针对入门级的新手参考 【实例截图】 目录结构&#xff1a; 文件&#xff1a;590m.com/f/25127180-494436327-f5ef7f&#xff08;访问密码&#xff1a;551685&#xff09; 【核心代码】class ItemController < ApplicationControllerscaffold :itemdef creat…

Ruby基础教程(Day1)—— Ruby初探

前提&#xff1a;自行安装ruby 一、Ruby初探 最常见的方法是使用ruby命令执行&#xff08;在helloruby.rb中输入print("Hello,Ruby.\n")&#xff09; 在命令行输入ruby helloruby.rb irb命令&#xff0c;以交互命令行方式来执行 在控制台执行irb如下图所示 对象 …

RubyPloticus

原文&#xff1a; RubyPloticus ruby 2006年6月19日 Bliki 索引 译注&#xff1a;代码和生成的图片示例可从这里下载。 在最近的帖子“ 评估Ruby”中&#xff0c;我提到一位同事曾在一个Web应用中加入了一些漂亮的数据图表&#xff0c;有人email问我是…