记录--让URL地址都变成了ooooooooo

news2024/11/18 3:47:01

这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助

发现一个很有创意的小工具网站,如封面图所示功能很简单,就是将一个URL地址转换为都是 ooooooooo 的样子,通过转换后的地址访问可以转换回到原始地址,简单流程如下图所示。转换的逻辑有点像短链平台一样,只不过这个是将你的URL地址变的很长长长长,但是看着都是 ooooooooo,很好奇是如何实现的,所以查阅了源码,本文解读其核心实现逻辑,很有趣且巧妙的实现了这个功能。

前置知识点

在正式开始前,先了解一些需要学习的知识点。因为涉及到两个地址其实也就是字符串之间的转换,会用到一些编码和解码的能力。

将字符转为utf8数组,转换后的每个字符都有一个特定的唯一数值,比如 http 转换后的 utf8 格式数组即是 [104, 116, 116, 112]

    toUTF8Array(str) {
        var utf8 = [];
        for (var i = 0; i < str.length; i++) {
            var charcode = str.charCodeAt(i);
            if (charcode < 0x80) utf8.push(charcode);
            else if (charcode < 0x800) {
                utf8.push(0xc0 | (charcode >> 6),
                    0x80 | (charcode & 0x3f));
            }
            else if (charcode < 0xd800 || charcode >= 0xe000) {
                utf8.push(0xe0 | (charcode >> 12),
                    0x80 | ((charcode >> 6) & 0x3f),
                    0x80 | (charcode & 0x3f));
            }
            else {
                i++;
                charcode = ((charcode & 0x3ff) << 10) | (str.charCodeAt(i) & 0x3ff)
                utf8.push(0xf0 | (charcode >> 18),
                    0x80 | ((charcode >> 12) & 0x3f),
                    0x80 | ((charcode >> 6) & 0x3f),
                    0x80 | (charcode & 0x3f));
            }
        }
        console.log(utf8, 'utf8');
        return utf8;
    }

上面是编码,对应下面的则是解码,将utf8数组转换为字符串,比如 [99, 111, 109] 转换后的 utf8 格式数组即是 com

    Utf8ArrayToStr(array) {
        var out, i, len, c;
        var char2, char3;

        out = "";
        len = array.length;
        i = 0;
        while (i < len) {
            c = array[i++];
            switch (c >> 4) {
                case 0: case 1: case 2: case 3: case 4: case 5: case 6: case 7:
                    // 0xxxxxxx
                    out += String.fromCharCode(c);
                    break;
                case 12: case 13:
                    // 110x xxxx   10xx xxxx
                    char2 = array[i++];
                    out += String.fromCharCode(((c & 0x1F) << 6) | (char2 & 0x3F));
                    break;
                case 14:
                    // 1110 xxxx  10xx xxxx  10xx xxxx
                    char2 = array[i++];
                    char3 = array[i++];
                    out += String.fromCharCode(((c & 0x0F) << 12) |
                        ((char2 & 0x3F) << 6) |
                        ((char3 & 0x3F) << 0));
                    break;
            }
        }

        return out;
    }

将 Number 对象以 4 进制的形式表示为字符串,toString 用的比较多,但是里面传入参数的场景比较少,这个参数 radix 是一个可选的参数,用于指定转换的进制数,范围为 2 ~ 36,如果未传入该参数,则默认使用 10 进制。

n.toString(4)

在字符串左侧填充指定字符,直到字符串达到指定长度。基本语法为 str.padStart(targetLength [, padString])

  • targetLength:必需,指定期望字符串的最小长度,如果当前字符串小于这个长度,则会在左侧使用 padString 进行填充,直到字符串达到指定长度。
  • padString:可选,指定用于填充字符串的字符,默认为 " "(空格)。
str.padStart(4, '0')

URL 编码/解码

下面正式开始URL编码的逻辑,核心的逻辑如下:

  • 转换为utf8数组
  • 转换为4进制并左侧补0到4位数
  • 分割转换为字符串数组
  • 映射到o的不同形式
  • 再次拼接为字符串,即转换完成后的URL
// 获取utf8数组
let unversioned = this.toUTF8Array(url)
    // 转换为base 4字符串
    // padstart非常重要!否则会丢失前导0
    .map(n => n.toString(4).padStart(4, "0"))
    // 转换为字符数组
    .join("").split("")
    // 映射到o的不同形式
    .map(x => this.enc[parseInt(x)])
    // 连接成单个字符串
    .join("")
上面有两个关键点解释一下,首先映射到o的不同形式这个是什么意思呢?其实转换后的o并不是一种“o”,而是4种,只不过我们肉眼看到的效果很像,通过  encodeURI 转换后的字符可以看出来。
encodeURI('o-ο-о-ᴏ')
// o-%CE%BF-%D0%BE-%E1%B4%8F

这里其实也解释了为什么上面为什么是转换为4进制和左侧补0到四位数。因为上面代码定义的 this.enc 如下,因为总共只有四种“o”,4进制只会产生0,1,2,3,这样就可以将转换后的utf8字符一一对应上这几种特殊的“o”。

enc = ["o", "ο", "о", "ᴏ"] 

最后的效果举例转换 http 这个字符:

  • 转换为utf8数组:[ 104, 116, 116, 112 ]
  • 转换为4进制并左侧补0到4位数:['1220', '1310', '1310', '1300']
  • 分割转换为字符串数组:['1', '2', '2', '0', '1', '3', '1', '0', '1', '3', '1', '0', '1', '3', '0', '0']
  • 映射到o的不同形式:[ 'ο', 'о', 'о', 'o', 'ο', 'ᴏ', 'ο', 'o', 'ο', 'ᴏ', 'ο', 'o', 'ο', 'ᴏ', 'o', 'o' ]
  • 再次拼接为字符串,即转换完成后的URL:οооoοᴏοoοᴏοoοᴏoo

到此整个转换编码的过程就结束了,看完后是不是觉得设计的很不错,编码完后就是解码,解码就是将上面的过程倒序来一遍,恢复到最原始的URL地址。这里要注意一点的是每次解析4个字符且parseInt以4进制的方式进行解析。

// 获取url的base 4字符串表示
let b4str = ooo.split("").map(x => this.dec[x]).join("")

let utf8arr = []
// 每次解析4个字符
// 记住添加前导0的填充
for (let i = 0; i < b4str.length; i += 4)
    utf8arr.push(parseInt(b4str.substring(i, i + 4), 4))
// 返回解码后的字符串
return this.Utf8ArrayToStr(utf8arr) 

到此就核心实现代码就分享结束了,看完是不是感觉并没有很复杂,基于此设计或许可以延伸出其他的字符效果,有兴趣的也可以试试看。将转码后的地址分享给你的朋友们一定会带来不一样的惊喜。

下面是我转换的一个AI小工具地址,点击看看效果吧~

ooooooooooooooooooooooo.ooo/ooooοооoοᴏο…

本文转载于:

https://juejin.cn/post/7225573912670191677

如果对您有所帮助,欢迎您点个关注,我会定时更新技术文档,大家一起讨论学习,一起进步。

 

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

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

相关文章

chatgpt赋能python:Python创建Word文档指南

Python创建Word文档指南 在今天的数字时代&#xff0c;Word文档仍然是最常见和使用的文档类型之一。Python是一个强大的编程语言&#xff0c;可以用于自动化创建各种类型的文档&#xff0c;包括Word文档。在本篇文章中&#xff0c;我们将介绍如何使用Python创建Word文档&#…

Rust每日一练(Leetday0019) 跳跃游戏、合并区间、插入区间

目录 55. 跳跃游戏 Jump Game &#x1f31f;&#x1f31f; 56. 合并区间 Mmerge Intervals &#x1f31f;&#x1f31f; 57. 插入区间 Insert Interval &#x1f31f;&#x1f31f; &#x1f31f; 每日一练刷题专栏 &#x1f31f; Rust每日一练 专栏 Golang每日一练 专…

KP3114电源IC介绍--【其利天下】

KP3114 是一款高性能低成本 PWM 控制功率开关&#xff0c;适用于离线式小功率降压型应用场合&#xff0c;外围电路简单、器件个数少。同时产品内置高耐压 MOSFET 可提高系统浪涌耐受能力。 与传统的 PWM 控制器不同&#xff0c;KP3114 内部无固定时钟驱动 MOSFET&#xff0c;系…

为什么陶瓷板视觉技术会越来越受到人们的青睐?

随着科技的不断进步和应用&#xff0c;陶瓷板视觉技术越来越受到人们的青睐。陶瓷板视觉技术是一种新型的非接触式检测技术&#xff0c;它可以在生产过程中对产品进行高效、准确的检测和质量控制。下面我们来详细了解一下陶瓷板视觉技术的优势和应用。 一、优势 1.高效性 陶…

10款抓包工具优缺点对比

1. Wireshark 介绍&#xff1a;Wireshark是一个免费的网络协议分析工具&#xff0c;支持Windows、macOS和Linux等多个平台。它可以捕获和分析网络数据包&#xff0c;支持多种网络协议解码。优点&#xff1a;功能强大、支持多种协议解码、支持多平台、过滤器功能强大、免费开源。…

QT+OpenGL实例化和抗锯齿

QTOpenGL实例化和抗锯齿 本篇完整工程见gitee:QtOpenGL 对应点的tag&#xff0c;由turbolove提供技术支持&#xff0c;您可以关注博主或者私信博主 实例化 如果我们需要渲染大量物体时&#xff0c; 代码看起来会像这样&#xff1a; for(int i 0; i < amount; i) {DoSom…

Mybatis 别名的配置 + Mybatis配置类的调查

参考资料 Mybatis配置类别名mybatis-spring-boot-autoconfigure类型别名&#xff08;typeAliases&#xff09;SpringBoot五步配置Mybatis超简教程 目录 一. 使用场景二. 前期准备2.1 实体类2.2 查询接口 三. 配置方式1 配置文件的方式3.1 application.yml文件3.2 SQL的XMl文件…

做完这些lab,国内外大厂横着走

hi&#xff0c;大家好&#xff0c;这里是极客重生&#xff0c;坚实的计算机基础&#xff0c;对我们发展都是至关重要的&#xff0c;不管是校招还是社招&#xff0c;因此我和小伙伴一起收集了一些国内外硬核lib和开源项目来帮助大家学习和巩固基础&#xff08;动手实践&#xff…

计算机组成原理 第一章_概述

typora-copy-images-to: images 文章目录 typora-copy-images-to: images1.现代计算机的结构2.各硬件的工作原理2.1 主存储器的基本组成2.2 运算器的基本组成2.3 控制器的基本组成2.4 计算机的工作过程 3.计算机系统的层次结构4. 计算机的性能指标4.1存储器的性能指标4.2 CPU的…

14-Vue3快速上手

目录 1.Vue3简介2. Vue3带来了什么2.1 性能的提升2.2 源码的升级2.3 拥抱TypeScript2.4 新的特性 1、海贼王&#xff0c;我当定了&#xff01;——路飞 2、人&#xff0c;最重要的是“心”啊&#xff01;——山治 3、如果放弃&#xff0c;我将终身遗憾。——路飞 4、人的梦想是…

chatgpt赋能python:Python如何创建一个DataFrame

Python如何创建一个DataFrame 在数据科学和分析领域中&#xff0c;DataFrame是一种非常常见的数据结构。它类似于电子表格&#xff0c;可以存储和处理包含多个列和行的数据。在Python中&#xff0c;pandas库提供了DataFrame数据结构的支持。 什么是DataFrame&#xff1f; Da…

Hugging News #0602: Transformers Agents 介绍、大语言模型排行榜发布!

每一周&#xff0c;我们的同事都会向社区的成员们发布一些关于 Hugging Face 相关的更新&#xff0c;包括我们的产品和平台更新、社区活动、学习资源和内容更新、开源库和模型更新等&#xff0c;我们将其称之为「Hugging News」&#xff0c;本期 Hugging News 有哪些有趣的消息…

聚观早报 | B站第一季度净亏损同比下降72%;​必应聊天放宽限制

今日要闻&#xff1a;B站第一季度净亏损同比下降72%&#xff1b;必应聊天放宽限制&#xff1b;马斯克再次成为世界首富&#xff1b;英伟达CEO黄仁勋计划访华&#xff1b;联想moto razr 40系列新品发布 B站第一季度净亏损同比下降72% 6 月 1 日消息&#xff0c;哔哩哔哩&#x…

哈希表理论基础

目录 哈希表 哈希函数 哈希碰撞 一般哈希碰撞有两种解决方法&#xff0c; 拉链法和线性探测法。 拉链法 线性探测法 常见的三种哈希结构 set map 总结 哈希表 哈希表是根据关键码的值而直接进行访问的数据结构。 哈希表中关键码就是数组的索引下标&#xff0c;然后通…

Linux NGINX 优化与防盗链

----------------隐藏版本号------------------- 可以使用 Fiddler 工具抓取数据包&#xff0c;查看 Nginx版本&#xff0c; 也可以在 CentOS 中使用命令 curl -I http://192.168.80.101 显示响应报文首部信息。 curl -I http://192.168.80.101 方法一&#xff1a;修改配置文件…

java工程师技术成长之路

1、新手阶段&#xff0c;全面、扎实地掌握语言的基本要素是你的当务之急。当然&#xff0c;除了语言&#xff0c;你还需要了解与编程相关的其他周边知识。 2、工作了几年&#xff0c;整天忙于业务代码&#xff0c;初级工程师很容易困惑下一步的方向在哪里&#xff0c;并且相当多…

KVM 虚拟化

1.1 前言 1.1.1 什么是虚拟化&#xff1f; 在计算机技术中&#xff0c;虚拟化&#xff08;技术&#xff09;或虚拟技术&#xff08;英语&#xff1a;Virtualization&#xff09;是一种资源管理技术&#xff0c;是将计算机的各种实体资源&#xff08;CPU、内存、磁盘空间、网络…

当你怀疑电脑的时候,就是该换个方法的时候了

做软件开发的朋友们&#xff0c;干的时间长了&#xff0c;相信都会有过类似的体验&#xff1a;一个问题查了很久很久&#xff0c;代码检查了很多遍很多遍&#xff0c;到最后都要怀疑电脑了&#xff0c;突然发现是一个特别隐蔽的错误导致的&#xff0c;而这种错误通常不涉及逻辑…

2021第十二届蓝桥杯Python组国赛【真题+解析+代码】

&#x1f381;2021第十二届蓝桥杯python组国赛真题 &#x1f680; 真题练习&#xff0c;冲刺国赛 &#x1f680; 2021第十二届蓝桥杯python组国赛真题解析代码 博观而约取&#xff0c;厚积而薄发 &#x1f3c6;国赛真题目录 文章目录 &#x1f381;2021第十二届蓝桥杯python组国…

chatgpt赋能python:Python创建一个3x3的数组

Python创建一个3x3的数组 如果您是一名Python的爱好者或是初学者&#xff0c;在处理数据的时候一定会遇到需要创建数组的情况。在本篇文章中&#xff0c;我们将会介绍如何使用Python创建一个3x3的数组。在这个过程中&#xff0c;我们将从定义数组开始&#xff0c;到最后输出结…