造轮子 Jsxbin Tools
前言
这个故事还得从一只蝙蝠说起(大雾
因为要弄一个总结某一节网课的重难点的视频,想弄个好(傻)看(气)的片头的我重新捡起来万年不动的 AE。在制作的过程中又遇到了蛋疼的英文脚本不能在中文版 AE 上良好运行的问题(因为脚本的表达式是英文的,但中文版 AE 却是中文的)。虽然说可以一个个去替换表达式里的英文,但遇上表达式多一些的脚本就很烦了。于是催生出了“弄一个自动汉化脚本工具”的想法。因为脚本大多为jsxbin的加密格式,不能直接使用(其实也行的,后面会提到),因此需要将其解码为jsx格式。在 GitHub 上找了找,发现只有一个数年前的项目jsxbin-to-jsx-converter和有关jsxbin加密方式的文章。虽然现成的项目能用到是能用,但既然都找到了分析jsxbin格式的文章了,不如就用 C++ 造一个轮子吧ο(=•ω<=)ρ⌒☆
JSXBIN 格式的分析
此处的内容基本都来自这一篇文章[1],有兴趣深挖的可以去看看原文。以下内容为阅读过程中整理的笔记
文件的头部
- JSXBIN 文件头部通常会有一个固定的字符串
@JSXBIN@ES@2.0@。这个没啥用,在需要转换为 JSX 文件的时候需要将其删去。 MyB和ByB分别表示文件内容的开头和结尾
文件的加密方式
虽然 Adobe 网站上给出的说法是
1 | The .jsxbin files are compiled JavaScript; they are in binary format so the source code is not exposed… |
但从实际内容上来看,感觉更加偏向于Base64加密这种类型。
字母
单个字母[a-z]被换成了j[B-Za],[A-Z]被换成了i[B-Za]。这种替换规则可以用下表来表示
| 小写字母 | 替换结果 | 大写字母 | 替换结果 |
|---|---|---|---|
| a | jB | A | iB |
| b | jC | B | iC |
| c | jD | C | iD |
| d | jE | D | iE |
| e | jF | E | iF |
| f | jG | F | iG |
| g | jH | G | iH |
| h | jI | H | iI |
| i | jJ | I | iJ |
| j | jK | J | iK |
| k | jL | K | iL |
| l | jM | L | iM |
| m | jN | M | iN |
| n | jO | N | iO |
| o | jP | O | iP |
| p | jQ | P | iQ |
| q | jR | Q | iR |
| r | jS | R | iS |
| s | jT | S | iT |
| t | jU | T | iU |
| u | jV | U | iV |
| v | jW | V | iW |
| w | jX | W | iX |
| x | jY | X | iY |
| y | jZ | Y | iZ |
| z | ja | Z | ia |
除了上面所示的转换方法外,它还具有一个标记了字母数量的前导值,例如a的前导值(字母计数器值)为B,而aa的前导值则为C。
上表可以用来表示文件中的变量名、函数名等,而对于字符串类型的数据,则会在前导值前加入一个标识符Fe,用来表示跟在它后面的内容是字符串的一部分。例如zzlwd可以被表示为FjajajMjXjE,而字符串"zzlwd"则会被表示为FeFjajajMjXjE。
特殊字符
特殊字符可以用下表来表示(均为半角)
| 特殊字符(string) | 含义(看看就好了) | 替换结果 |
|---|---|---|
| “ ” | 空格 | hA |
| “ | 双引号 | hC |
| ‘ | 单引号 | hH |
| & | 与 | hG |
| \ | 反斜杠 | ic |
| : | 冒号 | ha |
| . | 点 | hO |
| – | 破折号 | hN |
| _ | 下划线 | if |
| ? | 问号 | hf |
| ^ | 上标 | ie |
| ` | 反单引号 | ja |
| ~ | 波浪线 | je |
| ´ | Accent Aigu | lU |
| + | 加号 | hL |
| * | 星号 | hK |
| # | 井号 | hD |
| % | 百分号 | hF |
| / | 斜杠 | hP |
| | | 或 | jc |
| ( | 左括号 | hI |
| ) | 右括号 | jJ |
| > | 大于号 | hc |
| < | 小于号 | he |
(说起来全角字符应该如何处理…我看完文章后再试试看。)
数字
数字和包含数字的字符串可以用下表表示
| 数字 | 替换结果 | 数字(string) | 替换结果 |
|---|---|---|---|
| 0 | d (dA – 未经证实) | “0” | hQ |
| 1 | dB | “1” | hR |
| 2 | dC | “2” | hS |
| 3 | dD | “3” | hT |
| 4 | dE | “4” | hU |
| 5 | dF | “5” | hV |
| 6 | dG | “6” | hW |
| 7 | dH | “7” | hX |
| 8 | dI | “8” | hY |
| 9 | dJ | “9” | hZ |
| 10 | dK | “10” | hRhQ |
| 11 | dL | “11” | hRhR |
| 12 | dM | “12” | hRhS |
| 13 | dN | “13” | hRhT |
| 14 | dO | “14” | hRhU |
| 15 | dP | “15” | hRhV |
| 16 | dQ | “16” | hRhW |
| 17 | dR | “17” | hRhX |
| 18 | dS | “18” | hRhY |
| 19 | dT | “19” | hRhZ |
| 20 | dU | “20” | hShQ |
| 21 | dV | “21” | hShR |
| 22 | dW | “22” | hShS |
| 23 | dX | “23” | hShT |
| 24 | dY | “24” | hShU |
| 25 | dZ | “25” | hShV |
| 26 | dga | “26” | hShW |
| 27 | dgb | “27” | hShX |
| 28 | dgc | “28” | hShY |
| 29 | dgd | “29” | hShZ |
| 30 | dge | “30” | hThQ |
| 31 | dgf | “31” | hThR |
| 32 | dhA | “32” | hThS |
| 33 | dhB | “33” | hThT |
※上表仅仅表示单个数字或数字字符串的转换结果,不包含计数器的。
对于一个单纯的数字字符串,其转换方式和单纯的字母字符串一样,都是[计数器][替换结果]。例如“114514”可以表示为FeGhRhRhUhVhRhU(Fe表示字符串,G为长度计数器值)。
而对于114514这种纯粹的数字,其本身起着类似于计数器的作用,并且被表示为dgiwhe。
计数器

下面这个是数值转换的一个例子
1 |
|
字符计数器
如上图所示 (
行计数器
[等待更新…]
Jsxbin Tools 编写过程留下的笔记
[等待更新…]