这个有效的 Java 代码如何? (混淆Java)
How is this valid Java code? (obfuscated Java)
这段代码看起来显然不正确,但它在我的机器上编译并运行得很愉快。有人可以解释这是如何工作的吗?例如,是什么让 class 名称后的“)”有效?散布在周围的随机单词呢?
class M{public static void main(String[]a){System.out.print(new char[]{'H','e','l','l','o',' ','W','o','r','l','d','!'});}}
在线测试:https://ideone.com/t1W5Vm
资料来源:https://codegolf.stackexchange.com/a/60561
这是有效的 java 代码,但它使用阿拉伯语 "align right" 不可见的零宽度 ubicode 字符。尝试将光标放在文本中,然后按向右箭头。 "M"和")"之间有一个"char[]"和"a[]".
我尝试格式化代码,但在其中导航实在令人沮丧。
破译正在发生的事情的一种方法是逐个字符地查看程序 (demo)。
在那里你可能会发现7
和42
位置的字符是特殊的UNICODE字符RLO
(从右到左的顺序)和LRO
(左-到右顺序)字符。
删除它们后,程序开始看起来正常:
class M{public static void main(String[]a){System.out.print(new char[]{'H','e','l','l','o',' ','W','o','r','l','d','!'});}}
混淆程序编译的诀窍是 Java 编译器忽略这些特殊字符作为 格式字符 .
您会在源代码中找到两个 unicode 序列
0xE2 0x80 0xAE
http://www.fileformat.info/info/unicode/char/202e/index.htm
0xE2 0x80 0xAD
http://www.fileformat.info/info/unicode/char/202d/index.htm
有效地编写部分:
{public static void main(String[]a
从右到左
这段代码看起来显然不正确,但它在我的机器上编译并运行得很愉快。有人可以解释这是如何工作的吗?例如,是什么让 class 名称后的“)”有效?散布在周围的随机单词呢?
class M{public static void main(String[]a){System.out.print(new char[]{'H','e','l','l','o',' ','W','o','r','l','d','!'});}}
在线测试:https://ideone.com/t1W5Vm
资料来源:https://codegolf.stackexchange.com/a/60561
这是有效的 java 代码,但它使用阿拉伯语 "align right" 不可见的零宽度 ubicode 字符。尝试将光标放在文本中,然后按向右箭头。 "M"和")"之间有一个"char[]"和"a[]".
我尝试格式化代码,但在其中导航实在令人沮丧。
破译正在发生的事情的一种方法是逐个字符地查看程序 (demo)。
在那里你可能会发现7
和42
位置的字符是特殊的UNICODE字符RLO
(从右到左的顺序)和LRO
(左-到右顺序)字符。
删除它们后,程序开始看起来正常:
class M{public static void main(String[]a){System.out.print(new char[]{'H','e','l','l','o',' ','W','o','r','l','d','!'});}}
混淆程序编译的诀窍是 Java 编译器忽略这些特殊字符作为 格式字符 .
您会在源代码中找到两个 unicode 序列
0xE2 0x80 0xAE http://www.fileformat.info/info/unicode/char/202e/index.htm
0xE2 0x80 0xAD http://www.fileformat.info/info/unicode/char/202d/index.htm
有效地编写部分:
{public static void main(String[]a
从右到左