1
    String request=new String("UEsDBBQACAAIAHhoEEMAAAAAAAAAAAAAAAABAAAAMe1X247bNhD9FWPfs7Ls7GYNMEwpirLZSKTCy3r9xIfEKAJkd4F4W7R/36FuFH2RW/S18IM5Zw6PRsMZUkSf/nz+Mftj//Pw/fXl4016O7+Z7V++vn77/vLbxxtrincPN58woipzin2xTBuMSF2XnBLDpXA5MQQjrh0XOX/kuSUl3qEkBqIZXBQyRhQr8KbIXC1LZ+AJh28HlBwTohmkklYYnMa0Do2Y1CrFBN1hu36K2YMH0ZIzYRyVQsO/D/8IQYRSL+1KSYQzu5rhOxA7AVFuVZ+WncbLe2DFUBxCm4qQqA5oZNXO8RwezgvOFMw7Bw6Y1paLtSPWbKTiZjfmn/qE1oUTtsoa4ciydT5yRRasDqcsDuoMJppXI2UbRWQVVPdqq9WH+XyezheyTn9FyciDDHkaBNs8gc45sCZa11KZEO8Jkiv+yFTQTo6B3q6ZqrgZEXrgUZpgBp3zsLZKkIphYUgpUdKbfYF1tK+/H95en93b/vA2VFqvUEioSZiT4h/7t9nzfvb28y9Iz4AOhAUO8CLASzwL+BKjNRM56M5R0o1QRaAIoNS0IcZqvEDJEYKgpZmThcu4MhucrpqFglaLcejx47plVV3KHVOdKSm1dbtWXavoGSwQh+cIg5KRu5nZthBEGoyg2OTxM8lIyWY5KChOTcsM7p7NwjKdILBgXOauw3O8uIMXOwahI6msmMuIyHGa+jcNNtKkJNBXRbMd+v3jPaz0MTaKrdvv8lwxrTtr4+U6aGjj0LRDnMT0LFdJYTZ+A7nssmJcopHVGk2WktG4KKVUYUpsQpYZGwke2b3ZikaWtplVmUe7gZHbpoubv379fLcNQ8XWbaf3A6BCh214DdhoXEuXyac+iJnfgsZA7+8eGFtx1rdSff5/Df77GvyrJYiTnsRdAcetIdR0Vk25qxWvfGP1h1nO4SiBw4zKnEHv3oP8NVakQxQjsfthlT7cLWOdU1YkYljJ6o0Uw65yTuOE1EhIs4Ed4XycyTVC8J8JMJn0BudpXMmU0/sqmfGSTUU9yRgRLsV92T3yXoj8otc7WUV4OdSbr6tfYCevraZE3FJ5a9etSMxrpm5ZprlheLvd3p6d0xOQvlqCyXWKnq6/5IpfT5ZeMu3W1yrzGkFPVuakV09V5pRTX63Mqww9VXqzSOBC5JdLc9Kr/2FpnvKaqZOlOSb4w2y8pSanN7fuUtdZhRW0+SJrPvgGCzHxxXKfP/gExIt5upw/pHC3ieBBCm5rTkh897753fnjJHIg/4HtZRe3/im95U8sTVXPghun/+5szq8R3LMyRQTdwJ3Ah5oOrAAjKWCxmLOadV/hyQnSAf7aAAdTHigB2erAr/k8/fCOwjhbZ7ZNw/x+tVymKzjZRkQ/ayQaW3HGk/HN+m9QSwcI78e6fhgEAACNDwAAUEsBAhQAFAAIAAgAeGgQQ+/Hun4YBAAAjQ8AAAEAAAAAAAAAAAAAAAAAAAAAADFQSwUGAAAAAAEAAQAvAAAARwQAAAAA");
    byte[] resByte=new byte[11474836];

    resByte=Base64.decode(request.toString().getBytes());

    InputStream input = new ByteArrayInputStream(resByte);

    byte[] readByte = new byte[11474836];

    ZipInputStream zip = new ZipInputStream(input);
    int noofbyteRead = 0;

    if ( zip.getNextEntry() != null )
    {
        noofbyteRead = zip.read(readByte);
    }
    byte[] writeByte = new byte[ noofbyteRead ];
    System.arraycopy( readByte,0,writeByte,0,noofbyteRead);

    zip.close();
    input.close();


    /* String actualXmlmessage = new String(writeByte);*/
    String s1 = new String(writeByte);
    System.out.println(s1);

s1コンテンツの半分のみを表示します。完全なコンテンツを読み取らないのはなぜですか?

4

1 に答える 1

0

質問に答える前に、いくつかコメントさせてください。

StringString 定数から新しいものを作成する必要はありません。

String request= "UEsDBBQACAAIAHhoE....." ;

Base64.decodebyte[]結果を保持するための を受け取りません。したがって、おそらくそれが返すものを作成しています。したがって、resByte初期化する必要はありません。 resByteの宣言はちょうどあるべきです

byte[] resByte;

とはいえ、これ以上の詳細はありませんが、命令ではプラットフォームのデフォルトのエンコーディングString s1 = new String(writeByte);が使用されます(手動で設定していない場合、これは OS と OS の構成によって異なります)。エンコーディングが UTF-16 (すべての文字が 2 バイトに対応する) などの場合、 のバイト数のちょうど半分の文字を取得することになります。writeByte

文字化けしているように見える場合s1(「コンテンツの半分」または「コンテンツのみ」とは大きく異なり、質問でこれを指摘する必要があります)、これはほぼ確実に起こっていることです。

解決策は、次を使用することです。

String s1= new String(writeByte,charSetName) ;

は、非常に元の入力の文字セットに対応します ( base charSetName-64 でエンコードされる前だけでなく、圧縮される前でも)。

于 2013-08-18T08:46:43.520 に答える