彻底弄懂base64的编码与解码原理

article/2025/9/13 8:57:58

作者介绍

背景

base64的编码原理网上讲解较多,但解码原理讲解较少,并且没有对其中的内部实现原理进行剖析。想要彻底了解base64的编码与解码原理,请耐心看完此文,你一定会有所收获。

涉及算法与逻辑运算概念

在探究base64编码原理和解码原理的过程中,我们首先需要了解下面会用到的算法和逻辑运算的概念,这样才能真正的吃透base64的编码原理和解码原理,体会到其中算法的精妙,甚至是在思考的过程中得到意想不到的收获。不清楚base64编码表和ascII编码表的同学可直接前往文末查看。

短除法

短除法运算方法是先用一个除数除以能被它除尽的一个质数,以此类推,除到商是质数为止。
通过短除法,十进制数可以不断除以2得到多个余数。最后,将余数从下到上进行排列组合,得到二进制数,我们以字符n对应的ascII编码110为例。

    110 / 2  = 55...055  / 2  = 27...127  / 2  = 13...113  / 2  = 6...16   / 2  = 3...03   / 2  = 1...11   / 2  = 0...1

将余数从下到上进行排列组合,得到字符n对应的ascII编码110转二进制为1101110,因为一字节对应8位(bit), 所以需要向前补0补足8位,得到01101110。其余字符同理可得。

按权展开求和

按权展开求和, 8位二进制数从右到左,次数是0到7依次递增, 基数*底数次数,从左到右依次累加,相加结果为对应十进制数。我们以二进制数01101110转10进制为例:

(01101110)2 = 0 * 20 + 1 * 21 + 1 * 22 + 1 * 23 + 0 * 24 + 1 * 25 + 1 * 26 + 0 * 27

位概念

二进制数系统中,每个0或1就是一个位(bit,比特),也叫存储单元,位是数据存储的最小单位。其中8bit就称为一个字节(Byte)。

移位运算符

移位运算符在程序设计中,是位操作运算符的一种。移位运算符可以在二进制的基础上对数字进行平移。按照平移的方向和填充数字的规则分为三种:<<(左移)、>>(带符号右移)和>>>(无符号右移)。我们在base64的编码和解码过程中操作的又是正数,所以仅使用<<(左移)、>>(带符号右移)两种运算符。

  1. 左移运算:是将一个二进制位的操作数按指定移动的位数向左移动,移出位被丢弃,右边移出的空位一律补0。

  2. 右移运算:是将一个二进制位的操作数按指定移动的位数向右移动,移出位被丢弃,左边移出的空位一律补0,或者补符号位,这由不同的机器而定。在使用补码作为机器数的机器中,正数的符号位为0,负数的符号位为1。

我们用大白话来描述左移位,一共有8个座位,坐了8个人,在8个座位不动的情况下,现在我让这8个人往左挪2个座位,于是最左边的两个人站了起来,没有座位坐,而最右边空出来了两个座位。移位操作就相当于站起来的人出局,留出来的空位补0.

    // 左移01101000 << 2 -> 101000(左侧移出位被丢弃) -> 10100000(右侧空位一律补0)// 右移01101000 >> 2 -> 011010(右侧移出位被丢弃) -> 00011010(左侧空位一律补0)

与运算、或运算

与运算、或运算都是计算机中一种基本的逻辑运算方式。

  1. 与运算:符号表示为&。运算规则:两位同时为“1”,结果才为“1”,否则为0

  2. 或运算:符号表示为|。运算规则:两位只要有一位为“1”,结果就为“1”,否则为0

什么是base64编码

Base64编码是将字符串以每3个8比特(bit)的字节子序列拆分成4个6比特(bit)的字节(6比特有效字节,最左边两个永远为0,其实也是8比特的字节)子序列,再将得到的子序列查找Base64的编码索引表,得到对应的字符拼接成新的字符串的一种编码方式。

每3个8比特(bit)的字节子序列拆分成4个6比特(bit)的字节的拆分过程如下图所示:

base64

为什么base64编码后的大小是原来的4/3倍

因为6和8的最大公倍数是24,所以3个8比特的字节刚好可以拆分成4个6比特的字节,38 = 64。计算机中,因为一个字节需要8个存储单元存储,所以我们要把6个比特往前面补两位0,补足8个比特。如下图所示:很明显,补足后所需的存储单元为32个,是原来所需的24个的4/3倍。现在大家明白为什么base64编码后的大小是原来的4/3倍了吧。

为什么命名为base64呢?

因为6位(bit)的二进制数有2的6次方个,也就是二进制数(00000000-00111111)之间的代表0-63的64个二进制数。

不是说一个字节是用8位二进制表示的吗,为什么不是2的8次方?

因为我们得到的8位二进制数的前两位永远是0,真正的有效位只有6位,所以我们所能够得到的二进制数只有2的6次方个。

Base64字符是哪64个?

Base64的编码索引表,字符选用了"A-Z、a-z、0-9、+、/" 64个可打印字符来代表(00000000-00111111)这64个二进制数。即

    let base64EncodeChars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'

编码原理

我们不妨自己先思考一下,要把3个字节拆分成4个字节可以怎么做?你的实现思路和我的实现思路有哪个不同,我们之间又会碰出怎样的火花?

流程图

流程图

思路

分析映射关系:abc -> xyzi。我们从高位到低位添加索引来分析这个过程

  • x: (前面补两个0)a的前六位 => 00a7a6a5a4a3a2

  • y: (前面补两个0)a的后两位 + b的前四位 => 00a1a0b7b6b5b4

  • z: (前面补两个0)b的后四位 + c的前两位 => 00b3b2b1b0c7c6

  • i: (前面补两个0)c的后六位 => 00c5c4c3c2c1c0通过上述的映射关系,我们很容易得到下面的实现思路:

  1. 将字符对应的ascII编码转为8位二进制数

  2. 将每三个8位二进制数进行以下操作

  • 将第一个数右移位2位,得到第一个6位有效位二进制数

  • 将第一个数 & 0x3之后左移位4位,得到第二个6位有效位二进制数的第一个和第二个有效位,将第二个数 & 0xf0之后右移位4位,得到第二个6位有效位二进制数的后四位有效位,两者取且得到第二个6位有效位二进制

  • 将第二个数 & 0xf之后左移位2位,得到第三个6位有效位二进制数的前四位有效位,将第三个数 & 0xC0之后右移位6位,得到第三个6位有效位二进制数的后两位有效位,两者取且得到第三个6位有效位二进制

  • 将第三个数 & 0x3f,得到第四个6位有效位二进制数

  • 将获得的6位有效位二进制数转十进制,查找对应base64字符

  • 我们以hao字符串为例,观察base64编码的过程,我们将上面转换通过代码逻辑分析实现吧。

    代码实现

    // 输入字符串
    let str = 'hao'
    // base64字符串
    let base64EncodeChars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'
    // 定义输入、输出字节的二进制数
    let char1, char2, char3, out1, out2, out3, out4, out
    // 将字符对应的ascII编码转为8位二进制数
    char1 = str.charCodeAt(0) & 0xff // 104  01101000
    char2 = str.charCodeAt(1) & 0xff // 97  01100001
    char3 = str.charCodeAt(2) & 0xff // 111  01101111
    // 输出6位有效字节二进制数
    6out1 = char1 >> 2 // 26  011010
    out2 = (char1 & 0x3) << 4 | (char2 & 0xf0) >> 4 // 6  000110
    out3 = (char2 & 0xf) << 2 | (char3 & 0xc0) >> 6 // 5  000101
    out4 = char3 & 0x3f // 47 101111out = base64EncodeChars[out1] + base64EncodeChars[out2] + base64EncodeChars[out3] + base64EncodeChars[out4] // aGFv
    

    算法剖析

    1. out1: char1 >> 2

      01101000 -> 00011010
      
    2. out2 = (char1 & 0x3) << 4 | (char2 & 0xf0) >> 4

      // 且运算
      01101000        01100001
      00000011        11110000
      --------        --------
      00000000        01100000// 移位运算后得
      00000000        00000110// 或运算
      00000000
      00000110
      --------
      00000110
      

    第三个字符第四个字符同理

    整理上述代码,扩展至多字符字符串

    // 输入字符串
    let str = 'haohaohao'
    // base64字符串
    let base64EncodeChars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'// 获取字符串长度
    let len = str.length
    // 当前字符索引
    let index = 0
    // 输出字符串
    let out = ''
    while(index < len) {// 定义输入、输出字节的二进制数let char1, char2, char3, out1, out2, out3, out4// 将字符对应的ascII编码转为8位二进制数char1 = str.charCodeAt(index++) & 0xff // 104  01101000char2 = str.charCodeAt(index++) & 0xff // 97  01100001char3 = str.charCodeAt(index++) & 0xff // 111  01101111// 输出6位有效字节二进制数out1 = char1 >> 2 // 26  011010out2 = (char1 & 0x3) << 4 | (char2 & 0xf0) >> 4 // 6  000110out3 = (char2 & 0xf) << 2 | (char3 & 0xc0) >> 6 // 5  000101out4 = char3 & 0x3f // 47 101111out = out + base64EncodeChars[out1] + base64EncodeChars[out2] + base64EncodeChars[out3] + base64EncodeChars[out4] // aGFv
    }
    

    原字符串长度不是3的整倍数的情况,需要特殊处理

        ...char1 = str.charCodeAt(index++) & 0xff // 104  01101000if (index == len) {out2 = (char1 & 0x3) << 4out = out + base64EncodeChars[out1] + base64EncodeChars[out2] + '=='return out}char2 = str.charCodeAt(index++) & 0xff // 97  01100001if (index == len) {out1 = char1 >> 2 // 26  011010out2 = (char1 & 0x3) << 4 | (char2 & 0xf0) >> 4 // 6  000110out3 = (char2 & 0xf) << 2out = out + base64EncodeChars[out1] + base64EncodeChars[out2] + base64EncodeChars[out3] + '='return out}...

    全部代码

    function base64Encode(str) {// base64字符串let base64EncodeChars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'// 获取字符串长度let len = str.length// 当前字符索引let index = 0// 输出字符串let out = ''while(index < len) {// 定义输入、输出字节的二进制数let char1, char2, char3, out1, out2, out3, out4// 将字符对应的ascII编码转为8位二进制数char1 = str.charCodeAt(index++) & 0xffout1 = char1 >> 2if (index == len) {out2 = (char1 & 0x3) << 4out = out + base64EncodeChars[out1] + base64EncodeChars[out2] + '=='return out}char2 = str.charCodeAt(index++) & 0xffout2 = (char1 & 0x3) << 4 | (char2 & 0xf0) >> 4 if (index == len) {out3 = (char2 & 0xf) << 2out = out + base64EncodeChars[out1] + base64EncodeChars[out2] + base64EncodeChars[out3] + '='return out}char3 = str.charCodeAt(index++) & 0xff// 输出6位有效字节二进制数out3 = (char2 & 0xf) << 2 | (char3 & 0xc0) >> 6out4 = char3 & 0x3fout = out + base64EncodeChars[out1] + base64EncodeChars[out2] + base64EncodeChars[out3] + base64EncodeChars[out4]}return out
    }
    base64Encode('haohao') // aGFvaGFv
    base64Encode('haoha') // aGFvaGE=
    base64Encode('haoh') // aGFvaA==
    

    解码原理

    逆向推导,由每4个6位有效位的二进制数合并成3个8位二进制数,根据ascII编码映射到对应字符后拼接字符串

    思路

    分析映射关系 xyzi -> abc

    • a: x后六位 + y第三、四位 => x5x4x3x2x1x0y5y4

    • b: y后四位 + z第三、四、五、六位 => y3y2y1y0z5z4z3z2

    • c: z后两位 + i后六位 => z1z0i5i4i3i2i1i0

    1. 将字符对应的base64字符集的索引转为6位有效位二进制数

    2. 将每四个6位有效位二进制数进行以下操作

      1. 第一个二进制数左移位2位,得到新二进制数的前6位,第二个二进制数 & 0x30之后右移位4位,或运算后得到第一个新二进制数

      2. 第二个二进制数 & 0xf之后左移位4位,第三个二进制数 & 0x3c之后右移位2位,或运算后得到第二个新二进制数

      3. 第二个二进制数 & 0x3之后左移位6位,与第四个二进制数或运算后得到第二个新二进制数

    3. 根据ascII编码映射到对应字符后拼接字符串

    代码实现

    // base64字符串
    let str = 'aGFv'
    // base64字符集
    let base64CharsArr = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'.split('')
    // 获取索引值
    let char1 = base64CharsArr.findIndex(char => char==str[0]) & 0xff // 26  011010
    let char2 = base64CharsArr.findIndex(char => char==str[1]) & 0xff // 6  000110
    let char3 = base64CharsArr.findIndex(char => char==str[2]) & 0xff // 5  000101
    let char4 = base64CharsArr.findIndex(char => char==str[3]) & 0xff // 47  101111
    let out1, out2, out3, out
    // 位运算
    out1 = char1 << 2 | (char2 & 0x30) >> 4
    out2 = (char2 & 0xf) << 4 | (char3 & 0x3c) >> 2
    out3 = (char3 & 0x3) << 6 | char4
    console.log(out1, out2, out3)
    out = String.fromCharCode(out1) + String.fromCharCode(out2) + String.fromCharCode(out3)
    

    遇到有用'='补过位的情况时

    function base64decode(str) {// base64字符集let base64CharsArr = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'.split('')let char1 = base64CharsArr.findIndex(char => char==str[0])let char2 = base64CharsArr.findIndex(char => char==str[1])let out1, out2, out3, outif (char1 == -1 || char2 == -1) return outchar1 = char1 & 0xffchar2 = char2 & 0xfflet char3 = base64CharsArr.findIndex(char => char==str[2])// 第三位不在base64对照表中时,只拼接第一个字符串if (char3 == -1) {out1 = char1 << 2 | (char2 & 0x30) >> 4out = String.fromCharCode(out1)return out}let char4 = base64CharsArr.findIndex(char => char==str[3])// 第三位不在base64对照表中时,只拼接第一个和第二个字符串if (char4 == -1) {out1 = char1 << 2 | (char2 & 0x30) >> 4out2 = (char2 & 0xf) << 4 | (char3 & 0x3c) >> 2out = String.fromCharCode(out1) + String.fromCharCode(out2)return out}// 位运算out1 = char1 << 2 | (char2 & 0x30) >> 4out2 = (char2 & 0xf) << 4 | (char3 & 0x3c) >> 2out3 = (char3 & 0x3) << 6 | char4console.log(out1, out2, out3)out = String.fromCharCode(out1) + String.fromCharCode(out2) + String.fromCharCode(out3)return out
    }
    

    解码整个字符串,整理代码后

    function base64decode(str) {// base64字符集let base64CharsArr = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'.split('')let i = 0let len = str.lengthlet out = ''while(i < len) {let char1 = base64CharsArr.findIndex(char => char==str[i])i++let char2 = base64CharsArr.findIndex(char => char==str[i])i++let out1, out2, out3if (char1 == -1 || char2 == -1) return outchar1 = char1 & 0xffchar2 = char2 & 0xfflet char3 = base64CharsArr.findIndex(char => char==str[i])i++// 第三位不在base64对照表中时,只拼接第一个字符串out1 = char1 << 2 | (char2 & 0x30) >> 4if (char3 == -1) {out = out + String.fromCharCode(out1)return out}let char4 = base64CharsArr.findIndex(char => char==str[i])i++// 第三位不在base64对照表中时,只拼接第一个和第二个字符串out2 = (char2 & 0xf) << 4 | (char3 & 0x3c) >> 2if (char4 == -1) {out = out + String.fromCharCode(out1) + String.fromCharCode(out2)return out}// 位运算out3 = (char3 & 0x3) << 6 | char4console.log(out1, out2, out3)out = out + String.fromCharCode(out1) + String.fromCharCode(out2) + String.fromCharCode(out3)}return out
    }
    base64decode('aGFvaGFv') // haohao
    base64decode('aGFvaGE=') // haoha
    base64decode('aGFvaA==') // haoh
    

    上述解码核心是字符与base64字符集索引的映射,网上看到过使用AccII编码索引映射base64字符索引的方法

    let base64DecodeChars = [-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 62, -1, -1, -1, 63, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, -1, -1, -1, -1, -1, -1, -1, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, -1, -1, -1, -1, -1, -1, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, -1, -1, -1, -1, -1]
    // 
    let char1 = 'hao'.charCodeAt(0) // h -> 104
    base64DecodeChars[char1] // 33 -> base64编码表中的h
    

    由此可见,base64DecodeChars对照accII编码表的索引存放的是base64编码表的对应字符的索引。

    总结

    说起Base64编码可能有些奇怪,因为大多数的编码都是由字符转化成二进制的过程,而从二进制转成字符的过程称为解码。而Base64的概念就恰好反了,由二进制转到字符称为编码,由字符到二进制称为解码。Base64 是一种数据编码方式,可做简单加密使用,我们可以改变base64编码映射顺序来形成自己独特的加密算法进行加密解密。

    编码表


http://chatgpt.dhexx.cn/article/FaBxbdnN.shtml

相关文章

深入理解 Base64 底层原理

Base64 是一种常见数据编码方式&#xff0c;常用于数据传输。对于移动开发者来讲&#xff0c;网络请求中会经常使用到。对 JSON 熟悉的同学都知道&#xff0c;JSON 的序列化工具都不支持将 byte 数组直接放入 JSON 数据中&#xff0c;针对这种二进制数据&#xff0c;在处理的时…

Base64基本原理

1.什么是Base64 Base64是一种基于64个可打印字符来表示二进制数据的编码方式&#xff0c;是从二进制数据到字符的过程。 原则上&#xff0c;计算机中所有内容都是二进制形式存储的&#xff0c;所以所有内容&#xff08;包括文本、影音、图片等&#xff09;都可以用base64来表示…

一篇文章彻底弄懂Base64编码原理

在互联网中的每一刻&#xff0c;你可能都在享受着Base64带来的便捷&#xff0c;但对于Base64的基础原理又了解多少&#xff1f;今天这篇博文带领大家了解一下Base64的底层实现。 Base64的由来 目前Base64已经成为网络上常见的传输8Bit字节代码的编码方式之一。在做支付系统时&…

Base64编码原理

一、Base64是什么 base 64、base 32、base 16 编码建议标准 https://www.ietf.org/rfc/rfc4648.txt Base64是基于64种字符的编码算法&#xff0c;即将数据使用64种字符表示&#xff0c;编码后的Base64字符串长度 通常为原来的3-4倍。&#xff08;补充&#xff1a;Base32就是…

Base64原理

前言 Base64是什么?它和加解密操作有什么关系吗?我们看一下下边这段字符串: aGVsbG8gd29ybGQ= 这就是经过Base64编码后的字符串,对它进行Base64解码,获得它原来的内容: hello world 这有点加密解密的意味,不过Base64并不能称为加密算法,仅仅是加密算法的近亲,可以称之…

Base64原理解析

一. Base64编码由来 为什么会有Base64编码呢&#xff1f;因为有些网络传送渠道并不支持所有的字节&#xff0c;例如传统的邮件只支持可见字符的传送&#xff0c;像ASCII码的控制字符就 不能通过邮件传送。这样用途就受到了很大的限制&#xff0c;比如图片二进制流的每个字节不可…

base64加密原理详解

Base64编码&#xff0c;是我们程序开发中经常使用到的编码方法。它是一种基于用64个可打印字符来表示二进制数据的表示方法。它通常用作存储、传输一些二进制数据编码方法&#xff01;也是MIME&#xff08;多用途互联网邮件扩展&#xff0c;主要用作电子邮件标准&#xff09;中…

Base64基本原理及简单应用

1.什么是Base64 Base64是一种基于64个可打印字符来表示二进制数据的编码方式,是从二进制数据到字符的过程。原则上,计算机中所有内容都是二进制形式存储的,所以所有内容(包括文本、影音、图片等)都可以用base64来表示。 2.Base64编码原理 Base64编码之所以称为Base64,是因…

一文详解 Base64编码原理

最近在看Android的签名与验签机制&#xff0c;其中涉及到 MD5、SHA2、SHA256 等摘要算法&#xff0c;也涉及到 Base64 编码机制。这里先从简单的入手&#xff0c;记录一下 Base64 编码机制的原理。 一、Base64由来 Base64 是一种编码方式&#xff0c;最早出现在电子邮件传输协…

在Unity中导入fbx格式文件

unity中是以米为单位&#xff0c;要想让3dmax中建的模型导入到unity中与unity自带的3d object尺寸一致&#xff0c;最直接的办法是将3dmax中的系统单位也设成米。在三维软件里设置 在菜单->自定义->单位设置&#xff1a; 导出FBX文件前 &#xff0c;我们需要注意如下问…

读取FBX文件踩坑清单

FBX文件得到了许多3D制图软件与3D游戏引擎的兼容&#xff0c;其发展趋势大好。因此若要编写一款3D图形系统&#xff0c;对FBX格式的支持是必经之路&#xff08;或者使用插件形式&#xff09;。笔者尝试在百度、必应等搜索引擎&#xff0c;外加fbxsdk实例的帮助下&#xff0c;读…

查看fbx文件

查看fbx文件可以使用 1.auto fbx review 2.unity 导入Inport New Asset 找到文件夹导入 拖拽到scene中即可查看

「.XD 文件 」用什么软件打开?

1、什么是「.XD 文件 」 「.XD 文件 」其实是 Adobe XD 文件格式。而 Adobe XD 是一款基于矢量的一站式 UI/UX 设计工具&#xff0c;可以进行移动应用和网页设计与原1型制作&#xff0c;从早期的构思和低保真设计&#xff0c;一直到令人印象深刻的动画和逼真的原型&#xff0c…

Unity Fbx转Prefab工具

1.功能描述 a.可将fbx直接导出prefab。 b.同时为prefab预先按需挂载脚本文件。 c.同时为挂载的脚本设置参数&#xff0c;绑定资源等。 d.批量化处理&#xff0c;递归遍历算法&#xff0c;高效可扩展。 2.实现方式 a.Editor类 using Lean.Touch; using Main; using System; usi…

将FBX文件导入Unity3d中

在Project中找到选择Assets: 点击鼠标右键出现下拉列表&#xff0c;在下拉列表中选择“Import New Asset..."选项&#xff1a; 点击后选择你要导入的FBX文件&#xff0c;导入&#xff1a; 然而这样导入的模型并不会显示贴图&#xff0c;要让模型可以正常显示贴图&#xff…

【pymxs】max文件导出fbx文件

1. 前言 .max格式是Autodesk公司下的3dsmax软件的通用格式&#xff0c;许多软件出于商业考虑都有自己的格式&#xff0c;例如网易云下载的音乐。 这也就意味着.max文件只能用Autodesk的产品打开&#xff0c;即3dsmax或maya。 Autodesk的产品均是非开源、封闭式的&#xff0c…

Fbx文件解析(一)——FBX SDK for Windows环境配置

Fbx文件解析&#xff08;一&#xff09;——FBX SDK for Windows环境配置 一、下载并安装FBX SDK 下载网址&#xff1a;http://www.autodesk.com/fbx 找到与自己Windows对应、与自己的VS版本对应的SDK版本&#xff0c;下载并按照安装步骤安装。安装时选择的安装文件夹就是下…

pmx转fbx的具体步骤

本文主要讲述了在Windows10环境下&#xff0c;通过blender将pmx格式文件转化为fbx文件的具体步骤 本文主要包括以下三个部分&#xff1a; 一、blender下载与安装二、cats插件安装三、pmx格式转换为fbx格式 一、blender下载与安装 1.下载blender到电脑上 blender下载 建议下载…

关于unity导出FBX文件

最近有项目需求需要根据特殊文件来绘制自定义图形&#xff0c;考虑到其他编辑器对此文件的共用&#xff0c;所以将图形导出为FBX格式。 在网上找到了一个git仓库在这也记录分享一下&#xff1a; Git仓库:UnityFBXExporterhttps://github.com/Ymiku/UnityFBXExporter 插件功能…

加载FBX模型文件

深入理解加载FBX模型文件 每个模型文件都有自己的格式&#xff0c;有自研引擎的模型格式&#xff0c;有AutoDesk提供的模型文件格式&#xff0c;比如FBX模型文件&#xff0c;因为Unity与UE4引擎的使用而备受关注&#xff0c;FBX文件是AutoDesk提供的SDK&#xff0c;已经封装好了…