如何规避字符串大小限制?
How do I circumvent the String size limit?
我编写了一个加密给定 jar 文件的程序。很简单。现在我正在编写第二个程序,通过暴力破解文件来解密文件。 (它们都是独立的)
加密给定文件后,我得到一个包含加密文件数据的字节[]。我将这个 byte[] 转换为 String 并将其输出到控制台,这样我就可以轻松地复制和粘贴数据。
然后我在'decrypter'中初始化了一个新的字符串并粘贴了这个加密文件的数据。对于小文件,这可行,但对于大文件,由于 String 字面量大小限制,它不起作用。我怎样才能将这些数据硬编码到解密器中?
快速伪代码
加密器:
public byte[] encrypt(){
}
String encryptedData = Arrays.toString(encrypt(data));
解密器:
String encryptedData = "[-3, -66, -89, -14, 5, -72, 12, 5, ........
// note that I actually copy paste - hardcode the string
decrypt(stringToByteArray(encryptedData));
我不能在两个程序之间使用临时文件 read/write。
也许您应该使用 InputStream 而不是将字符串文字硬编码到您的 class 中?
将编码后的文本打散,然后像这样将各部分放在一起:
字符串加密数据= "blahblahblah" + "moreblahblah" + "etcetera";
使用 f.e 将加密数据写入文本文件并从那里读取。 BufferedWriter/FileWriter 和 BufferedReader/FileReader.
我建议使用文件进行临时存储,但如果您确实需要将数据转换为不能被字符编码破坏的字符串,最好的选择是 Base64.
您可以使用 javax.xml.bind.DatatypeConverter to convert byte arrays to strings and vice versa (see parseBase64Binary and printBase64Binary).
不要使用数组的toString
形式来序列化数据。
最好的解决方案是将其写入文件,然后从文件中读取。这可以使用 Files
实用程序 class.
轻松完成
要写:
final byte[] encrypted = ...
final Path output = Paths.get(".", "encrypted.bin");
Files.write(output, encrypted);
再读一遍:
final Path input = Paths.get(".", "encrypted.bin");
final byte[] encrypted = Files.readAllBytes(input);
要解决您眼前的问题,您可以 Base64 encode your binary data. This would greatly reduce the size of the String
representation. You can use the Base64
class JDK。
编码:
final byte[] encrypted = ...
final Base64.Encoder encoder = Base64.getEncoder();
System.out.println(encoder.encodeToString(encrypted));
解码:
final String encoded = ...
final Base64.Decoder decoder = Base64.getDecoder();
final byte[] encrypted = decoder.decode(encoded);
我编写了一个加密给定 jar 文件的程序。很简单。现在我正在编写第二个程序,通过暴力破解文件来解密文件。 (它们都是独立的)
加密给定文件后,我得到一个包含加密文件数据的字节[]。我将这个 byte[] 转换为 String 并将其输出到控制台,这样我就可以轻松地复制和粘贴数据。
然后我在'decrypter'中初始化了一个新的字符串并粘贴了这个加密文件的数据。对于小文件,这可行,但对于大文件,由于 String 字面量大小限制,它不起作用。我怎样才能将这些数据硬编码到解密器中?
快速伪代码
加密器:
public byte[] encrypt(){
}
String encryptedData = Arrays.toString(encrypt(data));
解密器:
String encryptedData = "[-3, -66, -89, -14, 5, -72, 12, 5, ........
// note that I actually copy paste - hardcode the string
decrypt(stringToByteArray(encryptedData));
我不能在两个程序之间使用临时文件 read/write。
也许您应该使用 InputStream 而不是将字符串文字硬编码到您的 class 中?
将编码后的文本打散,然后像这样将各部分放在一起:
字符串加密数据= "blahblahblah" + "moreblahblah" + "etcetera";
使用 f.e 将加密数据写入文本文件并从那里读取。 BufferedWriter/FileWriter 和 BufferedReader/FileReader.
我建议使用文件进行临时存储,但如果您确实需要将数据转换为不能被字符编码破坏的字符串,最好的选择是 Base64.
您可以使用 javax.xml.bind.DatatypeConverter to convert byte arrays to strings and vice versa (see parseBase64Binary and printBase64Binary).
不要使用数组的toString
形式来序列化数据。
最好的解决方案是将其写入文件,然后从文件中读取。这可以使用 Files
实用程序 class.
要写:
final byte[] encrypted = ...
final Path output = Paths.get(".", "encrypted.bin");
Files.write(output, encrypted);
再读一遍:
final Path input = Paths.get(".", "encrypted.bin");
final byte[] encrypted = Files.readAllBytes(input);
要解决您眼前的问题,您可以 Base64 encode your binary data. This would greatly reduce the size of the String
representation. You can use the Base64
class JDK。
编码:
final byte[] encrypted = ...
final Base64.Encoder encoder = Base64.getEncoder();
System.out.println(encoder.encodeToString(encrypted));
解码:
final String encoded = ...
final Base64.Decoder decoder = Base64.getDecoder();
final byte[] encrypted = decoder.decode(encoded);