如何规避字符串大小限制?

时间:2015-01-24 15:10:56

标签: java string size

我编写了一个加密给定jar文件的程序。很直接。现在我正在编写第二个程序,通过强制它来解密文件。 (它们都是独立的)

在加密给定文件后,我最终得到一个包含加密文件数据的byte []。我将这个byte []转换为String并将其输出到控制台,这样我就可以轻松地复制和粘贴数据。

然后我在'decrypter'中初始化一个新的String并粘贴加密文件的这些数据。对于小文件,这是有效的,但对于较大的文件,由于字符串文字大小限制,它不起作用。如何将这些数据硬编码到解密器中?

快速伪代码

加密器:

public byte[] encrypt(){
}
String encryptedData = Arrays.toString(encrypt(data));

Decrypter的:

String encryptedData = "[-3, -66, -89, -14, 5, -72, 12, 5, ........
// note that I actually copy paste - hardcode the string
decrypt(stringToByteArray(encryptedData));

我无法使用临时文件在两个程序之间进行读/写。

4 个答案:

答案 0 :(得分:2)

  1. 分解编码文本并将这些部分放在一起:

    String encryptedData =" blahblahblah" +" moreblahblah" +" etcetera";

  2. 将加密数据写入文本文件并使用f.e从那里读取。 BufferedWriter / FileWriter和BufferedReader / FileReader。

答案 1 :(得分:2)

不要使用数组的toString形式来序列化数据。

最佳解决方案是将其写入文件,然后从文件中读取。使用Files实用程序类可以非常轻松地完成此操作。

写:

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对二进制数据进行编码。这将大大减少String表示的大小。您可以使用JDK中提供的Base64类。

编码:

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);

答案 2 :(得分:1)

也许您应该使用InputStream而不是将字符串文字硬编码到您的类中?

答案 3 :(得分:0)

我建议使用文件进行临时存储,但如果您确实需要将数据转换为不会被字符编码损坏的字符串,那么最好的选择是 Base64
您可以使用javax.xml.bind.DatatypeConverter将字节数组转换为字符串,反之亦然(请参阅parseBase64BinaryprintBase64Binary)。