为何看似随机的整型值可让Java程序打印「Java is Awesome」?
代码能输出目标字符串的核心原因
这串整数根本不是无规律的随机值,本质是把「Java is Awesome」这串字符按4个一组打包成32位整型存储的结果,整个流处理流程就是反向解包还原字符串,逐环节拆解如下:
- 打包基础逻辑:Java中
int类型是固定32位(4字节)长度,刚好能完整存放4个单字节的ASCII字符——把每个字符的编码值按字节位置拼接成整数后,从十进制值看完全没有字符串的特征,第一眼很容易被当成随机数。 flatMap(e -> IntStream.range(0, 4).map(i -> e >> i * 8))这步负责拆包:对每个打包好的整数,依次做0位、8位、16位、24位的右移操作,把藏在32位空间里的4个独立字节全部暴露出来。mapToObj(i -> Character.toString((byte) i))这步做编码还原:把拆出来的整数强转成1字节的byte类型,直接丢弃高位的无效冗余位,只保留对应ASCII字符的编码值,再把编码值转换为对应的可见字符。- 最后通过
Collectors.joining()把所有还原出的字符按顺序拼接,就得到了完整的目标字符串。
逐值匹配验证
把每个整数拆出的字节对应到ASCII字符,能完全匹配预期输出:
- 整数
1635148106拆出的4个字节对应ASCII值为74、97、118、97,转换后是J、a、v、a - 整数
544434464拆出的4个字节对应ASCII值为32、105、115、32,转换后是空格、i、s、空格 - 整数
1936029505拆出的4个字节对应ASCII值为65、119、101、115,转换后是A、w、e、s - 整数
6647151拆出的4个字节对应ASCII值为111、109、101、0,转换后是o、m、e、空字符
把所有字符按顺序拼接,末尾的空字符在控制台输出时不会显示,最终打印的内容就是Java is Awesome。
内容的提问来源于stack exchange,提问作者Sandy
相关产品推荐
相关产品推荐

