Динамический размер строки

Я пытаюсь декодировать строку в кодировке base64. Я написал следующий кусок кода для этого:

String bytesEncoded = "rO0ABXNyADZ6YS5jby5zYi5wYXltZW50cy50by5pbnN0cnVjdGlvbi5CYXRjaEZpbGVVcGxvYWRD"
+ "UlVEVE8dnJ9z1jdsQwIAB0wAEGFic29sdXRlUGF0aE5hbWV0ABJMamF2YS9sYW5nL1N0cmluZztM"
+ "AAliYXRjaFR5cGVxAH4AAUwAFmN1c3RvbWVyUGF5bWVudFR5cGVLZXl0ABBMamF2YS9sYW5nL0xv"
+ "bmc7TAAhZW5jb2RlZEJ5dGVTdHJlYW1QYXltZW50QmF0Y2hGaWxlcQB+AAFMAAhmaWxlTmFtZXEA"
+ "fgABTAAIZmlsZVR5cGVxAH4AAUwABmlzc3Vlc3QAJEx6YS9jby9zYi9jb3JlL2NvbW1vbi90by9J"
+ "c3N1ZUxvZ1RPO3hyAB96YS5jby5zYi5jb3JlLnRvLkFic3RyYWN0Q1JVRFRP9ka5cD8D+JUCAAJK"
+ "AA12ZXJzaW9uTnVtYmVyTAAGYWN0aW9ucQB+AAF4cP//////////dAAGdXBsb2FkdACYQzpcbkJv"
+ "bF9Mb2FkVGVzdGluZ1xQZXJmb3JtYW5jZVRlc3RpbmdcbkJPTFxDVkFcUmVsZWFzZTE1XE1pc2Mg"
+ "RG9jc1xGaWxlcyBmb3IgVXBsb2FkXG5Cb2wgUHJvcCBSMTMtIERvbWVzdGljIGFkaG9jIDA4MDgy"
+ "MDE0IFRhbnphbmlhQmVuMiBWYWxpZCBQZXJmMi54bWx0AAdQYXltZW50c3IADmphdmEubGFuZy5M"
+ "b25nO4vkkMyPI98CAAFKAAV2YWx1ZXhyABBqYXZhLmxhbmcuTnVtYmVyhqyVHQuU4IsCAAB4cAAA"
+ "AAAAJKWidANsSDRzSUFBQUFBQUFBQU1WVlhXL1RNQlI5UitJL1JIMHZUanNZcmVSbFN0TU5LcUZS"
+ "MnNJUWIzZk9YV3Nwc1lmamxKVmZqeE5ucVowR05DUWtwS3J4T2ZmNmZweHJKL1R5TWMrQ1BhcUNT"
+ "M0V4R0wwS0J3RUtKbE11dGhlRHo1dnI0V1FRRkJwRUNwa1VlREVRY25BWnZYeEJaNkRaTHFKSldX"
+ "aVpvNnJoQ3UrakZXWUlCUVliRUQ5QmNBakNTVGdaaDZQWHdSTFZmVENtNUdRTFhZaENxNUpwVThJ"
+ "eG9rTldUZzRjaG1FNE9zYnBPTklPTnM0bS9URDVGdHR0WGZjVmZpKzV3dlRxRVZsWnNYUFFHRlVW"
+ "RDhPSitWSFM3MEdYU2pJc0NpUFV4d2RiK2tQTDNFQ08wUnJWbmpQOGdIdk1LT2tZSGVjdmtKVVkz"
+ "VWlWZytkbmVVcE9FeVU3VUZzc1pnZ0tWYlIrSHhzMVBJcHVGSWdDT3BJNlpLT01JMlBINkViWUhC"
+ "NHdtbFBTcFdnaVM2RlJMVUhwUTcySm5EQlhqMndIWW91cldqUGl3eWVVU0tHVkNXeGo5TEtmU3Fu"
+ "aEtEN3A0QmE2cG9qR2pGVUZtVzdxZW9sOTJBRVErMGptaTVzeXY2dEVJODY2MmRuQWFYaHUxQXFu"
+ "MC9Fb1BLZkVOOUxGSFZSNW0wZWI4K21rWVJybk5lT2N2cGF6T3QralNrcWx6TTA3UkxQYlpTTzF5"
+ "M3JxUDMrK3c3OGJjdktNSVF1K1JjV2haOVpMT09Rb3pMeWdxQWZSd2Y5MkdLT3o2ZmpOMlg4YWh0"
+ "dTZpWjFXQ2RPbWw3a1J1dENjeGVsT3NxZkdsdEs4UkxNNFRaVzV5YVlodS9qQVJkVzdoOVphSWVw"
+ "R0ZSZllFSWxNNjNlQ0F6YnloMmo4ajh1NlFuVllsM2R6dnVlRnZSbDlaTU1kclczMHRscml0eHR2"
+ "c2RMcW1nc1FqRU5XeWNoMWFjK2lOODVqaEhiVkpHbmE4TkJza1VScjh6ZTdmZmVWa2dyUm1WR2U3"
+ "ZFpTNmRyRkRQN3MvSzJ4K1RRbC9iV1FwdEpGVlh5T0tRZDErR1B4ZFU2YjJldWpvMGV2NENlaS9h"
+ "YW1ubUw4cTAyOHp5R3hIOXBmc2pQKzlLZ0hBQUE9dABDbkJvbCBQcm9wIFIxMy0gRG9tZXN0aWMg"
+ "YWRob2MgMDgwODIwMTQgVGFuemFuaWFCZW4yIFZhbGlkIFBlcmYyLnhtbHBw";

byte[] decodedBytes = Base64.decodeBase64(bytesEncoded);
System.out.println("decodedBytes " + new String(decodedBytes));

Вывод, который я получаю для этого, показан ниже:

System.out: decodedBytes ’

Теперь моя проблема, я хочу знать, связано ли это с переменной длиной. Если да, есть ли способ увеличить длину?

Я новичок в Java и сделал это с помощью поиска в Интернете. Пожалуйста, игнорируйте, если я очень наивен.

Я попытался просто преобразовать часть закодированной строки (только последняя строка, показанная ниже), и она показала мне строку правильно.

String bytesEncoded = "YWRob2MgMDgwODIwMTQgVGFuemFuaWFCZW4yIFZhbGlkIFBlcmYyLnhtbHBw";

byte[] decodedBytes = Base64.decodeBase64(bytesEncoded);
System.out.println("decodedBytes " + new String(decodedBytes));

Выход для того же ниже:

System.out: decodedBytes adhoc 08082014 TanzaniaBen2 Valid Perf2.xmlpp

4 ответа

Поскольку декодированные байты на самом деле содержат двоичный файл (с небольшими текстовыми частями), вы, вероятно, не имеете в виду обрабатывать декодированные байты как закодированные текстовые символы, что и является String(byte[]) сделаю для тебя.

Вместо этого вы можете печатать только печатные символы (распечатывая байты char-by-char и проверяя каждый символ на предмет его отображения), как описано в этом разделе, или отображая его в виде строки шестнадцатеричных символов, например описано в этой теме

Блок байтов, который вы пытаетесь преобразовать, определенно является не строкой текста, а двоичными данными какого-либо рода.

Он содержит несколько 0-значных байтов, которые обычно обозначают терминатор строки, и именно поэтому ваш исходный код показывает только два символа.

Используйте Apache Commons Codec. У него есть класс Base64.

используйте это так:

import org.apache.commons.codec.binary.Base64;
[..]
byte[] decoded = Base64.decodeBase64(base64string);

Maven артефакт:

<dependency>
    <groupId>commons-codec</groupId>
    <artifactId>commons-codec</artifactId>
    <version>1.9</version>
</dependency>

Декодированные байты просто не обозначают строку в кодировке символов по умолчанию (которая может варьироваться от платформы к платформе).

Возможно, он даже не обозначает строку (что, вероятно, в вашем случае). Но если это так, вы должны всегда указывать кодировку явно так:

String s = new String(bytesDecoded, charsetName);
// or
String s = new String(bytesDecoded, charset);

Конструктор String может принимать любую длину массива байтов, это не проблема.

Вот пример, который имеет значение charset:

String s = "Hi éáű!";
Systme.out.println(s); // Prints "Hi éáű!" obviously

byte[] b = s.getBytes(StandardCharsets.UTF_8);

// Next line also prints "Hi éáű!", charsets match:
System.out.println(new String(b, StandardCharsets.UTF_8));

// Next line prints "Hi éáű!", decoded with a different charset!
System.out.println(new String(b, StandardCharsets.ISO_8859_1));

Также обратите внимание, что String Конструктор не интерпретирует последовательности спецификаций (например, если ваш декодированный байтовый массив начинается с последовательности меток порядка байтов, он не будет обработан должным образом, а будет интерпретирован как байты строки).

Другие вопросы по тегам