为什么这个看似“随机”的数字会打印“JavaisAwesome”
这个程序如何打印“Java is Awesome”?
String s = IntStream.of(1635148106, 544434464, 1936029505, 6647151)
.flatMap(e -> IntStream.range(0, 4).map(i -> e >> i * 8))
.mapToObj(i -> Character.toString((byte) i))
.collect(Collectors.joining());
System.out.println(s);
回答
给你一点帮助:
01001010 01100001 01110110 01100001 (avaJ)
00100000 01101001 01110011 00100000 ( si )
01000001 01110111 01100101 01110011 (sewA)
01101111 01101101 01100101 (emo)
现在倒过来读:
01100001 01110110 01100001 01001010
00100000 01110011 01101001 00100000
01110011 01100101 01110111 01000001
00000000 01100101 01101101 01101111
这不过是:
1247901281
543781664
1098343795
1869440256
回答
所述IntStream.of(1635148106, 544434464, 1936029505, 6647151)创建了4个元素流。然后,对于这些元素中的每一个,我们将做
e -> IntStream.range(0, 4).map(i -> e >> i * 8)
这基本上创建了由操作产生的 4 个元素
e >> 0
e >> 8
e >> 16
e >> 24
因此,e -> IntStream.range(0, 4).map(i -> e >> i * 8)对元素的整个操作IntStream.of(1635148106, 544434464, 1936029505, 6647151)导致:
1635148106 6387297 24950 97
544434464 2126697 8307 32
1936029505 7562615 29541 115
6647151 25965 101 0
1635148106 6387297 24950 97
544434464 2126697 8307 32
1936029505 7562615 29541 115
6647151 25965 101 0
1635148106 6387297 24950 97
544434464 2126697 8307 32
1936029505 7562615 29541 115
6647151 25965 101 0
该flatMap(...)部件将之前的操作转换为IntStream.
然后在接下来的操作中:
74 97 118 97
32 105 115 32
65 119 101 115
111 109 101 0
74 97 118 97
32 105 115 32
65 119 101 115
111 109 101 0
mapToObj(i -> Character.toString((byte) i))
(byte) i因此首先应用:
变成:
如果您查看 ASCII 表:
对应于:<
JAVA
<space>is<space>
Awes
ome<null>
/p>
剩下的操作:<
.mapToObj(i -> Character.toString((byte) i))
.collect(Collectors.joining());
/p>
只需将其转换为String表示。
对于那些想知道如何从
你得到:
首先,将第一个元素转换为二进制,因为一个字节是 8 位,提取该二进制的最后 8 位,并将其转换回十进制。例如:<
1635148106
/p>
二进制是<
1100001011101100110000101001010
/p>
最后8位:<
01001010
/p>
十进制是74.
或转换为十六进制1635148106->6176614A确切相关部分(字节) ->4A并直接查看 ASCII 表 -> J。