首页 > 编程语言 >算法~base64算法理解

算法~base64算法理解

时间:2023-11-16 09:45:04浏览次数:32  
标签:编码 Base64 字符 二进制 base64 URL 算法 理解

base64

Base64 是一种用于将二进制数据编码成 ASCII 字符的编码方式。它主要用于在文字环境中传输或存储二进制数据,如在电子邮件、XML 文件、URL 参数等。Base64 编码不是一种加密算法,而是一种编码方式,其主要作用是将二进制数据转换为文本数据,以便更容易在文本协议中处理。

Base64 编码使用 64 个不同的字符来表示二进制数据。这些字符包括大小写字母 A-Z 和 a-z、数字 0-9,以及两个额外的字符通常是 "+" 和 "/"。有时候,为了适应不同的环境,可能还会使用额外的字符,如 "=" 用于填充。

编码的过程如下:

  1. 将待编码的数据划分为 3 个字节的块。
  2. 将每个字节块转换为一个 24 位的二进制数。
  3. 将这个 24 位的二进制数分为四个 6 位的块。
  4. 将每个 6 位的块转换为对应的 Base64 字符。
  5. 如果原始数据的长度不是3的倍数,可能会有一些填充字符(通常是 "=")。

解码的过程是编码的逆过程,将 Base64 字符转换回原始的二进制数据。

Base64 的主要优点是它能够将二进制数据以文本形式呈现,且编码后的数据长度通常比原始数据小,这对于在文本协议中传输二进制数据是很有用的。然而,它并不是为了安全而设计的,因此不应用于对数据进行加密。

url base64

UrlBase64 是 Base64 编码的一种变体,主要用于在 URL 中安全地传输二进制数据。它与标准的 Base64 编码相比,有一些微小的差异,以确保编码后的字符在 URL 中不会引起问题。

UrlBase64 主要有以下两个特点:

  1. 字符集不同: 在标准的 Base64 编码中,使用字符 "+", "/",而这两个字符在 URL 中有特殊的含义,可能会引起歧义或导致 URL 解析错误。为了解决这个问题,UrlBase64 将字符 "+" 替换为 "-", 将 "/" 替换为 "_"。

  2. 去掉填充字符: 标准的 Base64 编码在最后可能会使用一个或两个 "=" 字符进行填充,以使编码后的字符串长度是4的倍数。但是在 URL 中,这些填充字符可能引起问题,因此 UrlBase64 通常去掉填充字符,直接使用编码后的字符串。

总体而言,UrlBase64 是为了适应 URL 中的特殊需求而修改的 Base64 编码。在处理需要在 URL 中传递的二进制数据时,使用 UrlBase64 可以确保编码后的字符串在 URL 中是安全且可靠的。在使用 UrlBase64 解码时,需要在解码之前将 "_" 替换为 "/",将 "-" 替换为 "+",并根据需要添加填充字符。

算法演变

计算字符串在转成 Base64 编码后的长度可以通过以下简单的公式来估算:

  1. 计算原始字符串的字节数(每个字符通常占用一个字节,但是对于 Unicode 字符,可能会占用多个字节)。

  2. 计算 Base64 编码后的长度:

    这个公式的解释如下:

    • 每个 Base64 字符表示 6 个比特(2^6 = 64)。
    • 每组 3 个字节的数据被编码成 4 个 Base64 字符。
    • 如果原始字节数不能被 3 整除,可能会有填充字符 "="。

以下是一个简单的 Python 示例,演示如何计算字符串经过 Base64 编码后的长度:

  • 使用上面公式计算长度

base64最小长度是4位,每个base64的长度都是4的倍数,不够长度结尾补=符号
公式计算base64实际的长度,整除向上取整,例如18/6=2,28/6=3,38/6=4,48/6=6。

原字符 每6bit一组 base64编码
a 1*8/6=2 YQ==
ab 2*8/6=3 YWI=
abc 3*8/6=4 YWJj
abcd 4*8/6=6 YWJjZA==
abcde 5*8/6=7[] YWJjZGU=

pyhon实现

import base64

def base64_encoded_length(input_string):
    # 计算原始字节数
    original_bytes = len(input_string.encode('utf-8'))
    
    # 计算 Base64 编码后的长度
    base64_length = (original_bytes * 8 + 5) // 6
    
    # 考虑填充字符
    if original_bytes % 3 != 0:
        base64_length += 4 - (original_bytes % 3) * 2
    
    return base64_length

# 示例
original_string = "Hello, World!"
length_before = len(original_string)
length_after = base64_encoded_length(original_string)

print(f"原始字符串长度:{length_before}")
print(f"Base64 编码后长度:{length_after}")

请注意,这只是一个估算。实际的编码长度可能会受到编码实现细节的影响,例如是否包含换行符等。

标签:编码,Base64,字符,二进制,base64,URL,算法,理解
From: https://www.cnblogs.com/lori/p/17835495.html

相关文章

  • 对匈牙利算法的一些解释
    首先看蓝书上的代码为什么即将开始dfs时,没有一开始就把vis[i]标记了?其实dfs的流程是从左部的一个节点出发,考察右部的一个节点,如果右部的节点已经匹配了,下次dfs直接从这个右部节点的匹配点开始计算,所以vis的标记都是标记的右部节点,左部节点是不用标记的(因为是匹配二分图,只会被访......
  • 【路径规划】基于动态窗口法DWA算法的机器人动态避障路径规划研究附Matlab代码
    ✅作者简介:热爱科研的Matlab仿真开发者,修心和技术同步精进,代码获取、论文复现及科研仿真合作可私信。......
  • 2023全球智能汽车AI挑战赛——赛道二:智能驾驶汽车虚拟仿真视频数据理解赛道
    赛题:智能驾驶汽车虚拟仿真视频数据理解赛道任务:输入:元宇宙仿真平台生成的前视摄像头虚拟视频数据(8-10秒左右);输出:对视频中的信息进行综合理解,以指定的json文件格式,按照数据说明中的关键词(key)填充描述型的文本信息(value,中文/英文均可以)初赛提交格式:{"author":"abc","time":"YY......
  • 【iOS逆向与安全】某茅台App算法分析还原
    1.目标某茅台软件的actParam算法分析还原。2.使用工具mac系统frida-ios-dump:砸壳已越狱iOS设备:脱壳及frida调试IDAPro:静态分析Charles:抓包工具ss:小火箭,配合Charles使用3.流程处理启动闪退在IDAPro搜索SVC得到如下函数列表:NOP掉sub_函数的最后一行汇编......
  • 【课程】算法设计与分析——第八周 题解笔记
    第八周算法题解笔记1极值点题目描述给定一个单峰函数f(x)和它的定义域,求它的极值点该单峰函数f(x)保证定义域内有且只有一个极值点,且为极大值点题解本题感觉和dp关系不大,主要思路是三分法,和二分法非常类似,但没有二分法常用,主要用途是用来求单峰函数的极值对于任意一个......
  • 浙江大学数据结构陈越 第一讲 数据结构和算法
    数据结构数据结构是计算机科学中用来组织和存储数据的方式。它可以理解为一种组织数据的方式,能够有效地管理和操作数据,以及提供对数据进行存储、检索、更新和删除等操作的方法。常见的数据结构包括数组、链表、栈、队列、树和图等,它们各自适用于不同的应用场景,并且有着不同的特点和......
  • 理解与使用Javascript中的回调函数
     js里的解释:Acallbackisafunctionthatispassedasanargumenttoanotherfunctionandisexecutedafteritsparentfunctionhascompleted.    从字面上理解下来就是,回调就是一个函数的调用过程。假如函数a有一个参数,这个参数是个函数b,当函数a执行完......
  • 检测重叠时间段的算法 [重复]
    内容来自DOChttps://q.houxu6.top/?s=检测重叠时间段的算法[重复]我需要检测两个时间段是否重叠。每个时间段都有一个开始日期和结束日期。我需要检测我的第一个时间段(A)是否与另一个时间段(B/C)重叠。在我的情况下,如果B的开始等于A的结束,则它们不重叠(反之亦然)。我发现了以......
  • cryptography hash 算法使用
    安装pipinstallcryptography使用方法fromcryptography.hazmat.primitivesimporthashesdigest=hashes.Hash(hashes.SHA256())#digest=hashes.Hash(hashes.SHA3_256())#digest=hashes.Hash(hashes.SM3())digest.update(b"abc")print(digest.finalize())......
  • 负载均衡算法
    转载:负载均衡算法居然有这么多种!!!负载均衡算法总结_负载均衡算法有哪些_抓手的博客-CSDN博客负载均衡算法可以分为两类:静态负载均衡算法和动态负载均衡算法,另外还可以自定义负载均衡算法。静态负载均衡算法1、轮询(RoundRobin):服务器按照顺序循环接受请求。2、随机(Random):随机选择......