Base64编码详解

Base64编码过程:将二进制序列转换为Base64字符序列(ASCII码序列)。

一、标准Base64字符表

二、Base64编码示例

编码字符串"Hello!!",输出结果"SGVsbG8hIQ=="

三、Base64编码

原理:一个字节包括8位二进制, 然而字符表总共才64个字符,用6位二进制完全容纳64个字符,所以每6位二进制转换为对应的Base64字符。

编码过程:第一次读6位二进制,该子节剩余的2位转到下一次操作。恰好最少3个字节(24位)能转换成4个Base64字符,所以新数据的长度为原来数据3分之4倍。

特殊情况处理:当原来数据的字节数不是3的倍数时,如果除3余1时,规定在编码后添加2个"=",如果除3余2时,规定在编码后添加1个"="。

四、Base64编码自己实现

+(NSString*)base64fromData:(NSData*)originData
{
    const uint8_t* input = (const uint8_t*)[originData bytes];
    NSInteger originLength = [originData length];

    static char table[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=";

    NSMutableData* encodeData = [NSMutableData dataWithLength:((originLength + 2) / 3) * 4];
    uint8_t* output = (uint8_t*)encodeData.mutableBytes;

    NSInteger i;
    for (i=0; i < originLength; i += 3) {
        NSInteger value = 0;
        NSInteger j;
        for (j = i; j < (i + 3); j++) {
            value <<= 8;

            if (j < originLength) {
                value |= (0xFF & input[j]);
            }
        }

        NSInteger theIndex = (i / 3) * 4;
        output[theIndex + 0] =                    table[(value >> 18) & 0x3F];
        output[theIndex + 1] =                    table[(value >> 12) & 0x3F];
        output[theIndex + 2] = (i + 1) < originLength ? table[(value >> 6)  & 0x3F] : ‘=‘;
        output[theIndex + 3] = (i + 2) < originLength ? table[(value >> 0)  & 0x3F] : ‘=‘;
    }

    return [[NSString alloc] initWithData:encodeData encoding:NSASCIIStringEncoding];
}

五、NSData官方提供的Base64编码接口

/* Create an NSData from a Base-64 encoded NSString using the given options. By default, returns nil when the input is not recognized as valid Base-64.
*/
- (nullable instancetype)initWithBase64EncodedString:(NSString *)base64String options:(NSDataBase64DecodingOptions)options NS_AVAILABLE(10_9, 7_0);

/* Create a Base-64 encoded NSString from the receiver‘s contents using the given options.
*/
- (NSString *)base64EncodedStringWithOptions:(NSDataBase64EncodingOptions)options NS_AVAILABLE(10_9, 7_0);

/* Create an NSData from a Base-64, UTF-8 encoded NSData. By default, returns nil when the input is not recognized as valid Base-64.
*/
- (nullable instancetype)initWithBase64EncodedData:(NSData *)base64Data options:(NSDataBase64DecodingOptions)options NS_AVAILABLE(10_9, 7_0);

/* Create a Base-64, UTF-8 encoded NSData from the receiver‘s contents using the given options.
*/
- (NSData *)base64EncodedDataWithOptions:(NSDataBase64EncodingOptions)options NS_AVAILABLE(10_9, 7_0);
时间: 2025-01-02 06:53:30

Base64编码详解的相关文章

[转]各种字符集和编码详解

在软件的编码和实现中,我们可能会碰到个 一个比较头疼的问题--编码,不同字符间的编码和解码,你确定了解各种字符的编码吗?一个朋友问到了我这个问题,我虽然能回答一两个出来,但是感觉已经有点模糊,混乱了,在网上搜了搜,在书上翻了翻,总结一下吧.首先按照字符编码的历程来看: 1.  ASCII 我们需要了解的最早编码是ASCII码.它用7个二进制位来表示,由于那个时期生产的大多数计算机使用8位大小的字节,因此用户不仅可以存放所有可能的ASCII字符,而且有整整一位空余下来.如果你技艺高超,可以将该位用

[转] 从此不再惧怕URI编码:JavaScript及C# URI编码详解

混乱的URI编码 JavaScript中编码有三种方法:escape.encodeURI.encodeURIComponent C#中编码主要方法:HttpUtility.UrlEncode.Server.UrlEncode.Uri.EscapeUriString.Uri.EscapeDataString JavaScript中的还好,只提供了三个,C#中主要用的就有这么多,还没有列出其他编码(HTML),一多就弄不明白,弄不明白就心生恐惧,心生恐惧就变得苦逼,本文就向大家详细解释在JavaSc

Python字符编码详解(转)

1. 字符编码简介 1.1. ASCII ASCII(American Standard Code for Information Interchange),是一种单字节的编码.计算机世界里一开始只有英文,而单字节可以表示256个不同的字符,可以表示所有的英文字符和许多的控制符号.不过ASCII只用到了其中的一半(\x80以下),这也是MBCS得以实现的基础. 1.2. MBCS 然而计算机世界里很快就有了其他语言,单字节的ASCII已无法满足需求.后来每个语言就制定了一套自己的编码,由于单字节

Python 之路 Day02 -基础数据类型及编码详解

  基础篇 本章大纲: 字符编码和解释器编码详解 变量命名规则 基础数据类型(一) int 基础数据类型(二)  string 基础数据类型(三) bool 基础数据类型(四) list 基础数据类型(五) tuple 基础数据类型(六) dict 基础数据类型(七) set 补充可迭代对象的循环连接及enumerate输出 字符编码和解释器编码详解 一,编码的重要性: 1.1 文件编码和字符编辑编码及读取编码 #!/usr/bin/env python #-*- coding:utf-8 -*

【转】编码详解(下)

第二部分:JSP相关编码设置 2.1 JSP页面本身的编码形式 <%@ page language="java" import="java.util.*" pageEncoding="utf-8″%>pageEncoding 指的是jsp文件本身在本地保存时的编码方式.注意:在eclipse环境下会根据pageEncoding保存的. 2.2 服务器端发送字节流的编码 <%@ page contentType="text/htm

mysql编码详解

在开发程序的时候,我们使用mysql数据库开发的时候,有时会碰到自己明明输入的是中文,为什么数据库中存储的就是???? 1.在配置Connection URL时,加上?useUnicode=true&characterEncoding=utf-8 2.编辑/etc/my.cnf 在[mysqld]下添加 default-character-set=utf8 在[client]下添加 default-character-set=utf8   可是这样做的原理是什么?为什么这样做就能解决问题那? 逐

【转】编码详解(上)

第一部分:编码的种类 编码规范用于规定可见字符和控制字符的二进制表示形式,它分为多种类型:下面详细说说编码的方式: 1.1      ANSI编码 这种编码方式规定了英文占用了一个字节,中文占用两个字节(这个是我们通常所说的编码方式).因为汉字分为多个类型:有简体中文,有繁体中文,还有日语中的汉字.所以ANSI编码又分为:GB2312(简体中文),BIG5(繁体中文),JIS(日文)等各自的编码标准. 1.2 ASCII编码 这是美国上世纪60年代制定的.ASCII码一共规定了128个字符的编码

第二讲:编码详解,防止中文乱码

编码详解 编码支持: ASCII编码:美国信息交换标准代码(American Standard Code for InformationInterchange,简称ASCII)是一种用于信息交换的美国标准代码,它的作用是给英文字母.数字.标点.字符转换成计算机能识别的二进制数规定了一个大家都认可并遵守的标准. GB2312编码:适用于汉字处理.汉字通信等系统之间的信息交换 GBK编码:是汉字编码标准之一,是在 GB2312-80 标准基础上的内码扩展规范,使用了双字节编码 ANSI是与你使用的w

Base64编码格式详解

什么是Base64? 按照RFC2045的定义,Base64被定义为:Base64内容传送编码被设计用来把任意序列的8位字节描述为一种不易被人直接识别的形式.(The Base64 Content-Transfer-Encoding is designed to represent arbitrary sequences of octets in a form that need not be humanly readable.) 为什么要使用Base64? 在设计这个编码的时候,我想设计人员最