1

次のプログラム出力は、Windows システムと Unix システムで異なります。なぜこれが起こっているのか、またこの動作を Unix と Windows で一貫させる方法を教えてください。

ファイルのエンコードに Unix を使用しているため、Windows システムではデコードできません。

この点で何か助けていただければ幸いです。前もって感謝します。

import sun.misc.BASE64Encoder;
import sun.misc.CharacterEncoder;

public class TestEncode {

public static void main(String[] args) {        

        byte signature[] = "[35, 44, -31, 18, 78, 84, -113, 1, 27, 36, -79, -60, 75, -14, -80, -99, 65, 11, -45, -54, 23, -100, 74, -54, -26, -77, 33, -40, 104, 90, -33, 32, -123, -76, -27, -118, -25, -97, -85, 22, -64, 102, -7, 119, -65, 35, -114, 31, -83, 73, -57, 63, -7, 47, -31, 48, 28, -109, 54, -90, -24, -21, -102, 59, 82, -14, -52, -77, -22, -25, -15, -81, 70, 52, -42, 93, 76, -51, 96, 87, 29, -37, -40, -71, -121, 44, -44, 74, 23, -76, 29, 108, -56, 48, 46, -26, -73, -53, 90, 53, 25, -96, 115, -79, 93, -128, -46, -119, -30, 22, -107, -27, 6, -120, 2, 19, -72, -5, 30, -54, -34, 26, -22, -44, 93, 40, 84, -125]".getBytes();

    byte encodedSignature[] = null;

      CharacterEncoder encoder;
      encoder = new BASE64Encoder();
      encodedSignature = encoder.encode(signature).getBytes();


      System.out.println(encodedSignature.length);

}

}
4

2 に答える 2

3

各マシンで異なる文字セットを使用している可能性があります。これを試して調べてください:

System.out.println("Default Charset=" + Charset.defaultCharset());

メソッドを呼び出すときに問題があると思われますgetBytes()。デフォルトでは、プラットフォームのデフォルトの文字セットが使用されます。同じものを使用していることを保証したい場合は、getBytes()呼び出してメソッドで指定しますgetBytes("UTF-8");

于 2012-09-07T19:41:52.947 に答える
1

これを試してみて、Windows と Linux の結果を教えてください:

import com.sun.org.apache.xml.internal.security.exceptions.Base64DecodingException;
import com.sun.org.apache.xml.internal.security.utils.Base64;
import java.io.IOException;

public class Base64Test {

    public static void main(String args[]) throws IOException, Base64DecodingException {
        String orig = "original String before base64 encoding in Java";

        //encoding  byte array into base 64
        String encoded = Base64.encode(orig.getBytes("UTF-8"));//make sure the bytes are utf-8 and not platform default     

        System.out.println("Original String: " + orig );
        System.out.println("Base64 Encoded String : " + new String(encoded,"UTF-8"));//ensure string is utf-8

        //decoding byte array into base64
        byte[] decoded = Base64.decode(encoded);      
        System.out.println("Base 64 Decoded  String : " + new String(decoded,"UTF-8"));//ensure string is utf-8

    }
}

私は(Windowsのみ):

元の文字列: Java での base64 エンコーディング前の元の文字列

Base64 でエンコードされた文字列: b3JpZ2luYWwgU3RyaW5nIGJlZm9yZSBiYXNlNjQgZW5jb2RpbmcgaW4gSmF2YQ==

Base64 デコード文字列 : Java での base64 エンコード前の元の文字列

直面する可能性のある問題は次のとおりです。

  • Windows でデフォルトで使用される文字エンコードは、Linux のものとは異なります。特に、getBytes()関与しているため、独自のデフォルトに設定する可能性がありますgetBytes("UTF-8")(私の例では、これを実行しようとしました)
  • それぞれ ("\r\n") と ("\n") にデフォルト設定されている行区切り文字が原因である可能性があります。

しかし、私は確信が持てません

于 2012-09-07T19:08:11.293 に答える