打印字节数组的最短可理解形式

print shortest intellegible form of byte array

如标题所述:

byte[] encrypted = CryptUtils.encrypt(data, key);

System.out.println(encrypted.length);
System.out.println(new BigInteger(1, encrypted));
System.out.println(Hex.encodeHexString(encrypted));
System.out.println(Base64.encodeBase64URLSafeString(encrypted));

输出:

256
7168009243437822369854296216469732927594459719440755727503201192530003257397163143550783701334794173832880442110749731484646074400131932467256279320823407781569648004807653365193397061746088055905459344661520563977412309879548615096199872078298147648980941323616588222390445048851049622860590706553997636199882023404309651714685195366372945729024803306545341378698784529621539295122723246344789485664483371790124134351446837929993273793110653964164218755076959002468887573158308128829469244818441239599777150957470054497913346467414443384627016093340619366633629652523989548335430064353047141257059570514456595059522
38c815051cbe7d70b4498cb0899626bfbb42d973025f73ccb7bac5b927a2e5454fd1fff95a0457450039e19c545b88fb5065569e0f60d787d90e7f7701d8db39b2fbcf7500aa3a94b6f0a893a8892b55e0bedeb1cec0ab6adb4bffecd758ccd675ea51d3f090d266adca9e5a72ab0448426585e5ea306eea7f3607cd952a1a7b4a07bceba063ef04fa462c92ebffc65a35850aa37a31a405e98531e52631577e944bc0f22fcae33c9c93d6ff5d384e066a3c8b620abb5019aeeec8143acf74018a7eff33744ac94a6ac1f736a74868986759b24fb66a0274665f70ac5a27e1ab0e983931f3173dcb61610700b743de6a1e85653a2424bba671aa39debc3ed342
OMgVBRy-fXC0SYywiZYmv7tC2XMCX3PMt7rFuSei5UVP0f_5WgRXRQA54ZxUW4j7UGVWng9g14fZDn93AdjbObL7z3UAqjqUtvCok6iJK1Xgvt6xzsCrattL_-zXWMzWdepR0_CQ0matyp5acqsESEJlheXqMG7qfzYHzZUqGntKB7zroGPvBPpGLJLr_8ZaNYUKo3oxpAXphTHlJjFXfpRLwPIvyuM8nJPW_104TgZqPItiCrtQGa7uyBQ6z3QBin7_M3RKyUpqwfc2p0homGdZsk-2agJ0Zl9wrFon4asOmDkx8xc9y2FhBwC3Q95qHoVlOiQku6ZxqjnevD7TQg

是否有比 base64 更短的可理解形式?

最短的是什么?

Shortest 需要一些说明。但是如果我们谈论打印它(到控制台),我们暗示人类可读的字符。

所有终端可显示的人类可读字符集基本上是英文字母(小写字母和大写字母),数字加上一些符号,总共不到128。小于128的2的最大幂是64,也就是Base64编码的元素个数。

基本上你想用大小为 2 的幂的字符集来表示字节(因为字节是整数位数:8)所以字节和可显示字符的索引之间的转换将是简单快捷。

使用大于 64 的字符集将不得不使用可能无法在所有终端上显示的字符,或者无法在 URL 或文件名等中使用的字符。

因此,如果您希望 Base64 同时紧凑、可读、高效和便携,它是您的最佳选择。如果您愿意牺牲一些可移植性以换取更短的表示形式,您可以考虑使用 Base128。

请注意,如果您只想让它在支持特定范围的 unicode 字符的特定 terminals/applications 上工作,您甚至可以将 1 个字节显示为一个字符,在这种情况下,文本(字符)长度将是与字节长度相同,甚至更多,1个unicode字符可以表示2个字节。

我找到的最短的是 basE91,您可以在 http://base91.sourceforge.net/

找到它