造轮子 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 编写过程留下的笔记
[等待更新…]