首页 > 其他分享 >C语言中关于Base64编码的基础原理

C语言中关于Base64编码的基础原理

时间:2024-06-11 19:43:28浏览次数:23  
标签:编码 0000 字节 0011 Base64 C语言 1111

Base64编码简述:

1.Base64是网络上最常见的用于传输8Bit字节码的编码方式之一,Base64就是一种基于64个可打印字符来表示二进制数据的方法。
2.Base64,就是包括小写字母a-z、大写字母A-Z、数字0-9、符号"+"、"/"一共64个字符的字符集,(任何符号都可以转换成这个字符集中的字符,这个转换过程就叫做base64编码。
3.Base64编码是从二进制到字符的过程,可用于在HTTP环境下传递较长的标识信息。采用Base64编码具有不可读性,需要解码后才能阅读。

编码原理

关于这个编码的规则:
1.把3个字节变成4个字节。
2.每76个字符加一个换行符。
3.最后的结束符也要处理。

以下示例

转换前 11111111, 11111111, 11111111 (二进制)
转换后 00111111, 00111111, 00111111, 00111111 (二进制)

#include <string.h>
#include <stdio.h>

int main()
{
    // 设定编码前原数据为3个8bit的字节
    // data1 : 1111 1111
    // data2 : 1111 1111
    // data3 : 1111 1111
    // 编码后应转换为4个6bit的字节  采用高位补零  0011 1111  0011 1111 0011 1111 0011 1111(二进制)
    char data1 = 0xff, data2 = 0xff, data3 = 0xff;
    // 按照顺序对三个数据进行位运算操作
    // 第一个字节获得 0011 1111  data1 被分为1111 11 11
    char temp1 = data1 & 0x3f;

    // 第二个字节获得 0011 1111  包含data1的低2位1111 1111&0000 0011--> 0000 0011 -->0011 0000 和data2的高4位
    //  1111 1111 & (0000 1111-->1111 0000)-->1111 0000  -->0000 1111 &0011 0000
    char temp2 = ((data1 & 0x3) << 4) | ((data2 & (0xf << 4)) >> 4);

    // 第三个字节获得0011 1111 包含data2的低4位1111 1111&0000 1111-->0000 1111 <<2 -->0011 1100
    // data3的高2位 1111 1111 &(0000 0011<<6)-->1100 0000 >>4-->0000 0011
    // 位或后得到0011 1111
    char temp3 = ((data2 & 0xf) << 2) | ((data3 & (0x3 << 6)) >> 6);

    // 第四个字节获得0011 1111 包含data3的低6位 1111 1111&0011 1111
    char temp4 = data3 & 0x3f;

    // 打印验证结果
    printf("%#x,%#x,%#x,%#x\n", temp1, temp2, temp3, temp4);
}

注:以上代码为单个3字节转4字节,如数据量较大时,可使用循环进行批量操作
当处理到指定字节数时可对已处理字节数求余的方法进行特殊处理

以下为测试结果

image

标签:编码,0000,字节,0011,Base64,C语言,1111
From: https://www.cnblogs.com/lzlwyh/p/18242611

相关文章

  • 【C语言】预处理详解(下卷)
    前言紧随上文。命令行定义比如关机命令:shutdown-s-t60其中-s,-t是命令行参数。传的参数不同,效果也不同。许多C的编译器提供了一种能力,允许在命令行中定义符号,用于启动编译过程。如,当我们根据同一个源文件要编译出一个程序的不同版本时,这个特点有些用处。(假如某个程......
  • C语言笔记第14篇:动态内存管理
     1、为什么要有动态内存分配我们已经掌握的内存开辟方式有:创建变量charc=0;inta=0;intarr[10]={0};但是上述的开辟空间的方式有两个特点:空间开辟大小是固定的数组在声明的时候,必须指定数组的长度,数组空间一旦确定了大小不能调整但是对于空间的需求,不仅仅是......
  • C语言中的数据类型及其转换
    目录计算机中的数据类型整型数据之间的转换相同字长之间的转换小字长转大字长大字长转小字长int、float、double之间的转换float->doubledouble->floatfloat/double->intint->floatint->double计算机中的数据类型计算机中的数据以二进制的形式存储在寄存器或存储器中。机器怎......
  • JavaScript基础用法(变量定义、输入输出、转义符、注释和编码规范)
    天行健,君子以自强不息;地势坤,君子以厚德载物。每个人都有惰性,但不断学习是好好生活的根本,共勉!文章均为学习整理笔记,分享记录为主,如有错误请指正,共同学习进步。文章目录JavaScript基础用法1.变量1.1语法1.2示例代码1.3浏览器效果2.输入和输出2.1输出2.1.1输......
  • Csharp Base64 隐写.md
    Csharp(C#.net)Base64隐写最近被拉去报名参加CTF比赛,赶鸭子上架,趁着端午假期在网上做了做题,有一些题需要用到编程,网上介绍的一般都是Python写的,自己平时鼓捣的后端语言只有C#,python的脚本看得一知半解,有多函数还得去查阅用法,非常不方便,便想试着用C#写写试试,其实C#也支持在vsco......
  • C语言详解(文件操作)2
    Hi~!这里是奋斗的小羊,很荣幸您能阅读我的文章,诚请评论指点,欢迎欢迎~~......
  • C语言实战
    一、计算n的m次方(理论上只需要更改数组result[...]的元素个数,可以输出无穷大的结果)#include<stdio.h>#defineULLONG(unsignedlonglong)1000000000000000000ULLintmain(){ intn; intm; intcc=0;//监控循环次数 unsignedlonglongresult[10]={1,0,0,0,0,0......
  • C语言指针(函数指针的深入)
    在函数指针进阶中初步接触了函数指针现在来深度学习一下我们来分析两个题目加深一下对函数指针的理解例1:(*(void(*)())0)();分析这个函数的作用是什么?看到这段语句这么长是不是觉得很难,在我分析了之后就会变得非常简单分析之前我们先讲解一下C声明的组成任何C变量的声......
  • 冒泡排序(C语言)
    一.冒泡排序的原理冒泡排序的原理是:从左到右,相邻元素进行比较,以升序为例,第1次遍历将最大的数沉底。经过n次遍历这组元素以升序排列->第1次遍历,两个相邻的数比较大小,若左边的数大于右边的数,则两个元素交换位置,反之,继续向后比较,当第1次遍历结束之后该组元素最大的数就被移动......
  • 函数递归(C语言)(详细过程!)
    函数递归一.递归是什么1.1递归的思想1.2递归的限制条件二.递归举例2.1求n的阶乘2.2按顺序打印一个整数的每一位三.递归与迭代3.1求第n个斐波那契数一.递归是什么递归是学习C语言很重要的一个知识,递归就是函数自己调用自己,是一种解决问题的方法,下面就使用......