一个神奇的工具,让URL地址都变成了“ooooooooo“

news2025/4/9 18:20:43

一个神奇的工具,让URL地址都变成了"ooooooooo"

  • 一、核心代码
  • 二、URL编码/解码

在这里插入图片描述
     最近发现一个有意思工具,就是将一个URL地址转换为都是 ooooooooo 的样子,通过转换后的地址访问可以转换回到原始地址,转换的逻辑有点像短链平台一样,但是这个工具他是将你的URL地址变的很长长长长,但是看着都是 ooooooooo,个人觉得蛮有意思的,于是找到了它的源码仓库,便查阅了一番。顺便给大家讲讲实现逻辑。

一、核心代码

     涉及到两个地址其实也就是字符串之间的转换,会用到一些编码和解码。

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

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;
    }

二、URL编码/解码

  1. 转换为utf8数组
  2. 转换为4进制并左侧补0到4位数
  3. 分割转换为字符串数组
  4. 映射到o的不同形式
  5. 再次拼接为字符串,即转换完成后的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", "ο", "о", "ᴏ"] 

上述编码之后,还不能正常访问,想正常访问还需拼接一些东西:

let url = 'https://ooooooooooooooooooooooo.ooo/oooo'+ this.unversioned;

     编码完后就是解码,解码就是将上面的过程倒序来一遍,恢复到最原始的URL地址。这里要注意一点的是每次解析4个字符且parseInt以4进制的方式进行解析。

let b4str = ooo.split("").map(x => this.dec[x]).join("")
let utf8arr = []

// parse 4 characters at a time (255 in b10 = 3333 in b4)
// remember adding leading 0s padding
for (let i = 0; i < b4str.length; i += 4)
    utf8arr.push(parseInt(b4str.substring(i, i + 4), 4))
return this.Utf8ArrayToStr(utf8arr)

注意,解码时变量ooo是没有拼接东西的,也就是说它是编码时 unversioned的结果。如果拼接了东西,学把拼接的字符截取后在进行解码。

下面是我转换的一个在线工具地址,点击看看效果吧~
ooooooooooooooooooooooo.ooo/ooooοооoοᴏο…

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

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

相关文章

mysql8绿色版安装教程

最近在安装mysql8绿色版&#xff0c;以下是安装过程中的一些步骤&#xff1a; 1&#xff1a;解压zip压缩包至想要安装的目录&#xff0c;比如解压到D:\mysql\mysql-8.0.29-winx64 2&#xff1a;在解压目录D:\mysql-8.0.29-winx64中创建MySQL配置文件my.ini 配置文件my.ini内容…

Unity3D安装:离线安装 Unity

推荐&#xff1a;将 NSDT场景编辑器 加入你的3D工具链 3D工具集&#xff1a; NSDT简石数字孪生 在没有 Hub 的情况下离线安装 Unity Unity 下载助手 (Download Assistant) 支持离线部署。在这种部署方式中&#xff0c;可下载用于安装 Unity 的所有文件&#xff0c;然后生成脚本…

【日常】如何增加粉丝的粘性?

【日常】如何增加粉丝的粘性&#xff1f; 1、前言2、官方活动3、作品质量4、打造自己的社区 1、前言 不知不觉间&#xff0c;铁粉已经过千了&#xff0c;粉丝数也即将两万&#xff0c;总而言之&#xff0c;越努力&#xff0c;越幸运&#xff0c;付出就有回报&#xff08;当然在…

面了个阿里拿36K出来的,真是砂纸擦屁股,给我漏了一手

今年的春招已经结束&#xff0c;很多小伙伴收获不错&#xff0c;拿到了心仪的 offer。 各大论坛和社区里也看见不少小伙伴慷慨地分享了常见的面试题和八股文&#xff0c;为此咱这里也统一做一次大整理和大归类&#xff0c;这也算是划重点了。 俗话说得好&#xff0c;他山之石…

减肥瘦身自律APP软件开发功能有哪些?

减肥瘦身是很多女人一生都在奋斗的目标&#xff0c;如果找不对方法&#xff0c;减肥效果事倍功半还可能会反弹&#xff0c;所以越来越多的人推崇健康科学的减肥理念&#xff0c;把瘦身的重心转移到饮食和运动管理上&#xff0c;于是市场上出现了减肥瘦身自律类的APP软件&#x…

一位27岁软件测试员,测试在职近5年,月薪还不到2W,担心被应届生抢走饭碗

工作了近5年&#xff0c;一个月工资不到20K&#xff0c;担心被应届毕业生取代&#xff01;互联网的快速发展伴随着员工适者生存的加速&#xff0c;测试员的薪资也在不断增长&#xff0c;以3年、5年、8年为一条分水岭。如果人们的能力和体力不够&#xff0c;他们就会被淘汰。看起…

leetcode 146.LRU 缓存

题目链接&#xff1a;leetcode 146 1.题目 请你设计并实现一个满足 LRU (最近最少使用) 缓存 约束的数据结构。 实现 LRUCache 类&#xff1a; LRUCache(int capacity) 以 正整数 作为容量 capacity 初始化 LRU 缓存 int get(int key) 如果关键字 key 存在于缓存中&#xff0…

第四届全国人工智能大赛答疑分享会等你围观

为了帮助参赛团队更精准地理解赛题、更合理地运用AI相关技术&#xff0c;第四届全国人工智能大赛组委会诚邀鹏城实验室副研究员杨文瀚老师为大家进行AI视觉特征编码赛题解析与答疑&#xff0c;并分享《交通场景下的高效紧致特征表达》。 此次答疑分享会将于5月26日&#xff08…

供应商管理软件如何帮助企业提高盈利能力?

为了在当今快节奏的商业环境中保持竞争力和刺激增长&#xff0c;供应商管理技术正变得至关重要。供应商管理是任何公司最关键的因素之一&#xff0c;其中包括考核供应商、采购及招投标管理、协同管理等多项任务。 随着成熟的供应商管理软件的出现&#xff0c;企业主现在可以优…

三大特性之多态

文章目录 静态的多态动态的多态虚函数虚函数的重写&#xff08;覆盖&#xff09;利用虚函数重写实现多态重写的两个例外1.协变2.析构函数的函数名不同 C11的override和final 重载&#xff0c;重写&#xff08;覆盖&#xff09;&#xff0c;重定义&#xff08;隐藏&#xff09;抽…

什么是客户旅程,为什么它很重要?

多年来&#xff0c;企业专注于客户接触点来衡量客户满意度。近年来&#xff0c;企业已经看到接触点并不能捕捉到全貌。客户接触点只能在一个时间点衡量满意度。他们不一定保证客户对他们的整个旅程感到满意。但什么是客户接触点&#xff1f;是客户与企业互动的特定时刻&#xf…

怎么格式化只读U盘?

用户在格式化期间遇到磁盘只读&#xff08;写保护&#xff09;问题是比较常见的。通常&#xff0c;如果你的U盘处于写保护状态&#xff0c;则它便是只读&#xff0c;不允许你删除或修改U盘上的任何文件&#xff0c;以保护U盘的数据安全。如果需要只读u盘怎么格式化的问题&#…

免费的SVG在线编辑器大推荐

随着响应网络的发展&#xff0c;越来越多的高质量的SVG在线编辑器被公众所熟知。SVG矢量图形也越来越受欢迎&#xff0c;以便在任何设备上呈现图像&#xff0c;甚至一些易于使用的SVG在线编辑器&#xff0c;可以替代PS&#xff0c;本文总结了五种流行的SVG在线编辑器。 1.即时…

使用Windbg静态分析dump文件的完整过程介绍

目录 1、概述 2、静态分析dump文件的一般步骤 2.1、查看异常类型 2.2、使用.ecxr命令切换到发生异常的线程上下文&#xff0c;查看发生异常的那条汇编指令 3、问题分析实例说明 4、使用Windbg详细分析dump文件&#xff0c;展现完整分析过程 4.1、查看异常类型和发生崩溃…

FreeRTOS:队列

目录 前言一、队列简介1.1数据存储1.2多任务访问1.3出队阻塞1.4入队阻塞1.5队列操作过程图示1.5.1创建队列1.5.2向队列发送第一个消息1.5.3向队列发送第二个消息1.5.4从队列中读取消息 二、队列结构体三、队列创建3.1创建函数3.2函数xQueueCreateStatic()3.3函数xQueueCreate()…

隐私计算论文合集「联邦学习系列」第2期

前言&#xff1a; 隐语awesome-PETs&#xff08;PETs即Privacy-Enhancing Technologies &#xff0c;隐私增强技术&#xff09;精选业内优秀论文&#xff0c;按技术类型进行整理分类&#xff0c;旨在为隐私计算领域的学习研究者提供一个高质量的学习交流社区。awesome-pets包含…

集权设施攻防兵法:实战攻防之AD篇

一、黑客眼中的AD AD域是攻击者经常攻击的目标&#xff0c;因为AD域作为企业的核心身份验证和授权系统&#xff0c;攻击AD域可以使攻击者获得系统内所有计算机和用户的权限&#xff0c;从而轻松获取敏感信息和控制企业系统。 另外&#xff0c;AD域内存在众多的计算机资产&…

使用git在Github上创建自己的项目及一些基础操作

使用git在Github上创建自己的项目及一些基础操作 一、什么是git Git 是一个开源的分布式版本控制系统&#xff0c;用于敏捷高效地处理任何或小或大的项目。 Git 是 Linus Torvalds 为了帮助管理 Linux 内核开发而开发的一个开放源码的版本控制软件。 Git 与常用的版本控制工具…

Doris安装

Apache Doris 由百度大数据部研发&#xff08;之前叫百度 Palo&#xff0c;2018 年贡献到 Apache 社区后&#xff0c; 更名为 Doris &#xff09;&#xff0c;在百度内部&#xff0c;有超过 200 个产品线在使用&#xff0c;部署机器超过 1000 台&#xff0c;单一 业务最大可达…

Mac app文件签名与公证

一、Mac app文件签名与公证 在钥匙串中创建要公证app的profile&#xff08;公证的时候会用到&#xff09; xcrun notarytool store-credentials "mac_app" --apple-id "xxxxxxxx163.com" --team-id "S24Z9326XX" --password "fnjx-qjoe-l…